Objective-C

id类型

2019-02-21  本文已影响8人  越天高

1.静态类型和动态类型

Person *p = [Person new];
id obj = [Person new];
 id obj = [Person new];
        [obj sleep];
        [obj test];
       // [obj eat];
        
        id obj2 = [Student new];
        [obj2 eat];
        [obj2 test]; 

为了避免动态数据类型引发的运行时的错误, 一般情况下如果使用动态数据类型定义一个变量, 在调用这个对象的方法之前会进行一次判断, 判断当前对象是否能够调用这个方法

id obj = [Person new];
        [obj sleep];
       // [obj test2];
       // [obj test];
    
        id stu = [Student new];
        if ([obj isKindOfClass:[Student class]]) {
         // isKindOfClass , 判断指定的对象是否是某一个类, 或者是某一个类的子类

        }
        if ([stu isMemberOfClass:[Student class]]) {
            // isMemberOfClass : 判断指定的对象是否是当前指定的类的实例
            [stu eat];
            //[stu test2];
        }

2.为什么要有动态类型?

//定义NSObject * 类型
 NSObject* obj = [Cat new];
 Cat *c = (Cat*)obj;
 [c eat];
/// Represents an instance of a class.
struct objc_object {
    Class isa  OBJC_ISA_AVAILABILITY;
};

/// A pointer to an instance of a class.
typedef struct objc_object *id;
 id obj = [C at new];
 [obj eat]; // 不用强制类型转换

 [obj test]; //可以调用私有方法

3.id数据类型与静态类型

- (BOOL)isKindOfClass:classObj 判断实例对象是否是这个类或者这个类的子类的实例
- (BOOL) isMemberOfClass: classObj 判断是否是这个类的实例
+ (BOOL) isSubclassOfClass:classObj 判断类是否是指定类的子类
上一篇下一篇

猜你喜欢

热点阅读