黑马程序员技术交流社区

标题: OC第五天总结(2)(细节不全 但概要全有 留给未来的自己) [打印本页]

作者: 普通蜗牛    时间: 2015-8-10 21:40
标题: OC第五天总结(2)(细节不全 但概要全有 留给未来的自己)
***************************************
@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





作者: 黑马中的小绵羊    时间: 2015-8-10 21:47
总结很到位




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