黑马程序员技术交流社区

标题: OC第5天学习总结 [打印本页]

作者: pumpkin    时间: 2015-12-7 22:13
标题: OC第5天学习总结
1.------<a  target="blank">Java培训、Android培训、iOS培训、.Net培训</a>、期待与您交流! -------
黑马程序员—OC第五天学习总结

好吧,如标题所示,这是我对OC第五个文件夹个人认为比较重点或者是比较容易忘记的知识点进行整理,以便自己的日后复习。也希望对初学者有所帮助~

使用点语法(方法的调用,没有get和set方法就不能使用点语法):
[p setAge:18];//p.age=19 (此时对象和属性名并不是直接访问实例变量,而是Xcode看到点语法后会帮我们自己替换成p setage:19
[p setName:”@X”];//p.name=@”XX”;

Int a=p.age //调用get方法,实际上,当xcode看到p.age出现在等号的右侧后,他会帮我们替换替换成[p age];

点语法:Xcode编译器的特性,编译器帮我们做代码替换

@property是编译器的指令
@property告诉编译器声明属性的访问器(getter/setter)方法

          类型名       方法名(去掉set)
@property   int           age:
作用1在xcode4.4之前,用于帮我们实现方法的声明
2 在xcode4.4之后,有增强功能

@synthesize用法
1@property int age;
@synthesize age;表示生成.h中变量age的set和get方法

@synthesize age;//帮我们生成了一个变量age
//-(void)setAge:(int)age{
  Self—>age=age;}

@syntehseize方法名一定要现在.h中使用@property int 方法名

//如果两个实例变量类型一致
@synthesize age,weight;//property同理

如果我们要指定操作实例变量:
@synthesize age=_age,weight=_weight;这样写了以后就是
-(void)setAge:(int)age{
_age=age;
}
@synthesize 方法名=实例变量名
当指定实例变量名后,此时再不生成也不会操作默然的实例变量了

//@property的增强
//Xcode4.4之后,可以只使用@property,而不使用@synthesize
//声明和实现了_age的GEt和Set方法
//操作是带有下划线的实例变量
//如果我们当前类没有下划线的实例变量,则会帮我们生成有下划线的实例变量
//生成的_age都是相对私有变量(对别的类或者子类来说)

@property增强下重写get和set方法
在.m文件下
手动重写set方法
-(void)setAge:(int)age{
  If(age>0){_age=age;}
  else{_age=0}
}
Set 和Get 只能重写一个,两个重写就报错(都重写就用@synthesize)

动态类型:程序直到执行时才能确定所属的类
静态类型:将一个变量定义为特定类的对象时,使用的就是静态类型

//NSObject访问子类特有的方法run
NSObject  *obj=[Animal new];
[(Animal*)obj  run];//动物再跑

//访问子类特有方法
Obj=[Dog new];
[(Dog*)obj run];

Id类型是一种通用的对象类型,它可以用来存储属于任何类的对象(万能指针)
Id obj2;
Obj2=ani;
[obj2 run];
//NSObject 和 id 都可以指向任何对象
//NSObject 对象会进行编译时检查,需要强制类型转换
//id不需要强制类型转换,id可以直接使用
//编译器看到id以后,认为是动态类型,不在检查类型

Ios5之后推出了instancetype类型
Instancetype和id的异同
1相同点
都可以作为方法的返回类型
2不同点
Instancetype可以返回和方法所在类相同类型的对象,id只能返回未知类型的对象;
Instancetype只能作为返回值,不能像id那样作为参数

动态类型检测方法
1判断类型
-(BOOl)isKindOfCLass:classObj 判断实例对象是否是这个类或者这个类的子类的实例。

Animal *ani=[animal new];
//ani是否是Animal类的实例对象
//动态类型检测:
//1判断类型

//1判断某个对象是否是类的实例对象,或者子类的实例对象
//isKindOfClass使用格式:[对象 isKindOfClass 类对象];
BOOL isINstance=[ani  isKindOfClass:[Animal class]];
NSLog(@”%d”,isInstance);//1   ani是animal类的实例

2
-(BOOL)siMemberOfClass:classObj判断是否是这个类的实例,不管是否是这个类的子类的实例。//格式:[对象 isMemberOfClass:类对象]

3
+(BOOL)isSubclassOfClass:classOBj(判断类是否是指定类的子类)
BOOl isSub=[Dog issubclassOfClass:[Animal class]];

判断对象能否应用相应指定的方法
1-(BOOL)respondsToSelector:selector 判断实例是否有这个run方法

SEL s1=@selector(eat);//把eat包装成SEL类型
BOOL isRespond=[ani respondsToSelector:s1];
If (isRespond){[(Dog*)ani eat];}

2+(BOOL)INstancesRespondToSelector:判断类是否有这个方法
//格式:对象  RespondToSelector:方法的SEl
isRespond=[Dog  instancesRespondToSelector:s1];

响应方法:
1
SEL s1=@selector(eat);
If([ani respondsToSelector:s1]){
[ani performSelector:s1];//作用:响应方法,没有参数
}

2
通过PerformSelector响应有参的方法
SEl s2=@selector(eat:);
[ani performSelector:s2 withObject:@”一块占有”];
}//响应有参数的方法

3
响应有两个参数的方法
//performSelector:withObject:withObject:
[Ani performSelector:@selector(eat:andfooname:)withObject:@“XX”withObjcet:@“XXx”];

Alloc分配存储空间,Init进行初始化,返回对象本身。构造方法就是init。
(内存在alloc前已经清0)

OC中的构造方法:
  给对象进行初始化的方法
OC中给对象进行初始化的方法:
Init 该方法是一个对象方法
     该方法返回的是一个对象(调用init方法的对象)
Oc的构造方法,学习哪个东西
主要学习如何重写构造方法,让对象创建成功以后,就有初始的值

重写构造方法
//当子类把父类的init覆盖了,默认的先执行子类的
-(instancetype)init{
self=[Super inti];//先让父类把原来做的事情做完,防止父类的初始化release丢了self指向的空间并重新alloc了一块空间。这样super init可能alloc失败,这时候不再执行if语句
If(self)//判断父类初始化有没有成功{
   _age=10;//给年龄设置为默认值10岁
         }
Return self;//self指代方法的调用者(Person alloc)

[super run];//表示调用了父类的run方法
         //此处super指代的是父类对象

1初始化父类
Self=[super inin];
2判断是否初始化成功
If (self)
3初始化当前类的实例变量
_sno=1;
4return self;

例题:
给士兵一把枪
If (self=[super init]){
Gun *gun=[Gun new];
gun.bulletCount=3;
_gun=gun;}
Ruturn self

自定义构造方法
1一定是个对象方法
2返回值是id类型(instancetype)
3方法名以initwith开头

-(instancetype)initwithNAme:(NSString*)name andAge:(int)age{
_name=name;
_age=age;
}
主程序:
Person *p1=[Person alloc] initWithName:@”张三丰” andAge:1];
NSLog(@”%d,%@”,p1.age,p1.name);

If (self=[super inwithName:name andAge:age])调用了上一级的方法。

作者: 能不能行    时间: 2015-12-7 22:43
支持支持
作者: 刘炼1993    时间: 2015-12-7 23:19
6666666666666
作者: 小贼船    时间: 2015-12-7 23:31
笔记记得好详细啊
作者: pumpkin    时间: 2015-12-7 23:53
小贼船 发表于 2015-12-7 23:31
笔记记得好详细啊

谢谢。。话说今天我才知道要积技术分。。好惨啊
作者: Tmac90301    时间: 2015-12-7 23:54
总结的不错,给顶一下,继续搞技术分吧,不容易的
作者: iOS-lye    时间: 2015-12-8 00:04
好好学习,天天向上
作者: 黑马。。肖锋    时间: 2015-12-8 07:46

666666666666
作者: joiezw    时间: 2015-12-9 16:58
666666666666666加油




欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2