***************************************
@property 属性生成器
***************************************
动态类型和静态类型
动态类型:程序直到执行时才能确定所属的类
静态类型:将一个变量定义为特定类的对象时,使用的是静态形态
使用动态类型的原因:
只有使用动态类型 才能让不同的对象使用同样的方法名
***************************************
id类型及应用场景
//NSObject和id都可以指向任何对象
1.NSObject访问子类对象方法
NSObject *obj=[Animal new];
[(Animal *) obj run];// 因为NSObject对象会进行编译时检查所以需要强制类型转换
2.id类型 是一种通用的
Dog *d2=[Dog new];
id obj3=d2;
[obj3 run];//不需要进行强制类型转换,可以直接用 是因为编译器看到id以后,认为是动态类型,不再检查类型
3.id应用场景
//动物类
Animal *animal = [Animal new];
//狗的类,狗继承自动物
Dog *dog = [Dog new];
//猫的类,猫继承自动物
Cat *cat = [Cat new];
//定义id类型
id obj = cat; //id obj = dog;//想执行狗的run便让obj指向dog 想执行猫的run便让obj指向cat
[obj run];//不需要强制转换 可以直接使用
#warning iOS5之后推出了instancetype类型
instancetype和id的异同
1. 相同点 都可以作为方法的返回类型
2. 不同点
1)instancetype可以返回和方法所在类相同类型的对象,id只能返回未知类型的对象;
2)instancetype只能作为返回值,不能像id那样作为参数,
3)id可以定义类型 但instancetype不能定义类型
***************************************
动态类型检测
1.动态绑定:在objective-c中,一个对象内否调用指定的方法不是由编译器决定而是由运行时决定,这被称作是方法的动态绑定。
2.动态类型检测方法
内省概念(了解就行):对象在运行时获取其类型的能力称为内省。内省可以有多种方法实现
1)判断类型
-(BOOL) isKindOfClass: classObj 判断实例对象是否是这个类或者这个类的子类的实例。
------------------->>>>>>>>>>>>>
@interface Animal : NSObject
@end
@implementation Animal
@end
------------->>>>>>
@interface Dog : Animal
@end
@implementation Dog
<#methods#>
@end
-------------------->>>>>>>>>>>>>
Animal *ani=[Animal new];
Dog *dog =[Dog new];
//ani 是Animal 类的实例对象
//动态类型检测
//判断类型
//判断某个对象是否是类的实例对象,或者子类的实例对象
isKindOfClass使用格式[对象 isKindOfClass 类对象]
BOOL isInstance =[ani isKindOfClass:[Animal class]];
NSLog(@"%d",isInstance);//输出结果为1
isInstance =[dog isKindOfClass:[Dog class]];
NSLog(@"%d",isInstance);//输出结果为1
2)-(BOOL) isMemberOfClass: classObj 判断对象是否是指定类的实例对象
格式:[对象isMemberOfClass:类对象]
isInstance =[dog isMemberOfClass:[Animal class]];//0
isInstance =[ani isMemberOfClass:[Animal class]];//1
3)+(BOOL) isSubclassOfClass:classObj
判断类是否是指定类的子类(类和类之间的关系)
格式: [类A isSubclassOfClass:类B];
判断类A是否是类B的子类 是 YES 不是 NO
//Dog Animal
// 1 Dog 类继承自 Animal
BOOL isSub = [Dog isSubclassOfClass:[Animal class]];
// 通过对象来获取类对象
isSub = [[dog class] isSubclassOfClass:[ani class]];
// Class
isSub = [Dog isSubclassOfClass:[Animal class]];
// 0 Person 不是 Animal的子类
isSub = [Person isSubclassOfClass:[Animal class]];
// 0 Animal不是Dog的子类
isSub = [Animal isSubclassOfClass:[dog class]];
NSLog(@"isSub = %d",isSub);
***************************************
//动态类型检测的第二部分
判断对象能否响应指定的方法
1.-(BOOL) respondsToSelector: selector 判读实例是否有这样方法
Animal *ani = [Dog new];
//1) 判断实例对象能否响应(调用)指定的方法
//格式: [对象 respondsToSelector:方法的sel];
SEL s1 = @selector(eat); //把eat包装成SEL类型
BOOL isRespond = [ani respondsToSelector:s1];//判断ani是否用 eat的方法 如果有 返回值为1 如果没有 返回值为0
-------------->>>>>>>>>>>>>>>
2.+(BOOL) instancesRespondToSelector:(SEL)sel 此方法的作用是判断类是否有指定的方法。 此方法是类方法, 不能用在类的对象上
isRespond = [Dog instancesRespondToSelector:s1];//判断Dog类中是否有eat的方法 如果有 返回值为1 如果没有返回值为0
|
|