黑马程序员技术交流社区

标题: 学习笔记21:OC基础(8) [打印本页]

作者: 新生heima    时间: 2015-8-18 23:42
标题: 学习笔记21:OC基础(8)
@property是编译器指令,告诉编译器声明属性的访问器(getter和setter)方法;
免去手工写get和set方法

@property的使用:(仅仅是帮我们做了声明,没有做实现,需要手动实现)
1)        使用格式
@property  数据类型  方法名(去掉set)
    @property  int  age;//千万别写成 _age ,要不自动帮我们声明的方法名都会变。
2)        作用:
在Xcode4.4之前,用于帮我们实现get/set方法的声明
在Xcode4.4之后,有增强功能

注意事项:
1)        一定要写在@interface和@end之间
2)        一定要规范写方法名


@synthesize帮我们实现了成员变量的get和set方法
@synthesize age;//帮我们生成了一个变量age  !!!
替代:
-(void)setAge:(int) age{
                Self->age=age;
}

-(int)age{
        Return  age;
}
考点:在这里是重新生成的成员变量的值,和定义的成员变量不一样,当我们在打印成员变量值时,还是为空的状态。

注意:
方法名一定要 在.h中使用 @property  数据类型  方法名;不能单独写新的

@synthesize指定实例变量赋值:(不像上面一样帮我们重新生成两个新的变量,这样容易出错)
在类型一致的情况下,可以@property int age,weight;@synthesize int age,weight;

指定实例变量的@synthesize  age=_age,weight=_weight;(在实现的时候,不同类型的变量也能写在一起)!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!

@property增强使用
在Xcode4.4之后,可以只使用@property而不使用@synthesize,完成成员变量_age  的声明和实现.
操作的对象是带有下划线的成员变量
如果我们的当前类,没有下划线的实例变量,系统会帮我们生成(但是生成的变量是私有变量不能被继承)
在增强模式下,如果同时只能重写get或set一个方法如果两个都重写了,系统就会报错(因为此时@property多余了,白给你自动生成了。)
如果真的想重写,需要在加上@synthesize,这样就表示不使用增强模式,可以重写

所有类都继承与NSObject类,所以NSObject类的对象在强制类型转换之后可以使用任何类的对象方法。
NSObject *obj=[Animal  new];
[(Animal *)obj  run];

ID类型
Id 是一种通用的对象类型,它可以存储任何类的对象,也可以理解为万能指针。

Id类型的使用:
Id  obj;
Obj=ani;
[obj  run];//动物在跑
Obj=dog;
[obj  run];//狗在跑
NSObject和id都可,以指向任何对象
NSObject会进行编译检查(需要强制类型转换才能使用不同名的方法)
Id可以直接用(编译器看到id以后就认为是动态绑定,就不能再检查了,运行时才检查)

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


动态类型检查

对象在运行时获取其类型的能力叫做内省
1,        判断类型
(1)        判断某个对象是否是类的实例对象,或者子类的实例对象。(对象和类)
isKindOfClass使用格式[对象 isKindOfClass:类对象];
BOOL  isInstance=[ani   isKindOfClass:[Animal class]];


(2)-(BOOL)  isMemberOfClass:classObj;判断时候是这个类的实例,不管子类 (对象和类)

(3)-(BOOL)类对象 isSubclassOfClass: 类对象
判断是否是制定类的子类(类和类之间的关系)
获取类对象的方法有两种[dog class]或者[Dog class];


2,方法响应的检测
(1)判断  【实例对象  】能否响应(调用)指定方法

-(BOOL)respondsToSelector:SEL;判断实例是否有这样的方法。
SEl s1=@selector(eat);
BOOL  isRespond=[ani respondsToSelector:s1];
(小结:父类对象调用子类中新增的方法,即使强制类型转换也不行。父类类型的指针指向子类对象的情况下,强制类型转换下是可以的。Animal *ani =[Dog  new])

(2)判断【类】中有没有指定方法:(这个方法是类方法,但是他判断的方法没有区分,继承也是能判断的)
+(BOOL)instancesRespandToSelector:

响应方法:
并不是强制类型转换[(Dog*)ani eat] 而是 SEL s1=@selector(eat);[ani PerformSelector:s1];
通过SEL选择器找到相应的方法,这是响应无参的方法。
还要响应有参的方法。
SEL s2=@selector(eat:);
[ani PerformSelector:s12  withObject:@”XXXXX”];//两个参数可以再增加一个withObject,但是最多支持两个参数。

作者: 毛强    时间: 2015-8-19 00:17
怒赞,一起加油啊
作者: 新生heima    时间: 2015-8-19 10:05
毛强 发表于 2015-8-19 00:17
怒赞,一起加油啊

加油!希望都能进入11期
作者: xiaohu90    时间: 2015-8-20 07:18
很好,加油
作者: runsunlife    时间: 2015-8-20 09:03
论坛还有客户端吗
作者: smilejoke    时间: 2015-8-20 09:05
加油,笔记做的很好
作者: 庞佳星    时间: 2015-8-20 09:07
加油加油!!很棒!!!
作者: wdcew    时间: 2015-8-20 09:18
很好,不错不错!!!




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