@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,但是最多支持两个参数。
|
|