Runtime

作者: bytebytebyte | 来源:发表于2021-04-13 10:01 被阅读0次
1.哈希表=散列表 以空间换时间
2.@synthesize 自动生成setter、getter的实现,自动生成成员变量
@dynamic 不要自动生成setter、getter的实现,不要自动生成成员变量

@implementation MJPerson
@synthesize age = _age;  属性名=成员变量名
@end

3.[super message]底层实现
(1)消息接受者仍然是子类对象 重要!!!!!!!
(2)从父类开始查找方法的实现
4.
Student:Person
init {
      nslog([self class]); Student
      nslog([self superclass]);Person
      nslog([super class]); Student //消息的接受者仍然是self即Student
      nslog([super superclass]);Person  
}

class底层实现:返回消息接受者的类对象。
- (Class)classs {
             return object_getClass(self);
}
superclasss底层实现:返回消息接受者的父类对象。
- (Class)superclasss {
             return object_getSuperclass(object_getClass(self)); 
//nslog([super superclass])中上面哪一行object_getClass(self)=Student
}
5.NSProxy 是专门用来做消息转发的,定位更加精准,没有init方法
6.method_exchangeImplementations本质
交换的是类对象的class_rw_t -> method_array_t数组中的 method_list_t数组中的 method_t的imp;
清除cache_t;

7.
    NSLog(@"%d",[[NSObject class] isKindOfClass:[NSObject class]]); //1 
    NSLog(@"%d",[[NSObject class] isMemberOfClass:[NSObject class]]);//0
    NSLog(@"%d",[[MJPerson class] isKindOfClass:[MJPerson class]]);//0
    NSLog(@"%d",[[MJPerson class] isMemberOfClass:[MJPerson class]]);//0

+ (Class)superclass {
    return self->superclass;
}

- (Class)superclass {
    return [self class]->superclass;
}

+ (BOOL)isMemberOfClass:(Class)cls {
    return object_getClass((id)self) == cls;
}

- (BOOL)isMemberOfClass:(Class)cls {
    return [self class] == cls;
}

+ (BOOL)isKindOfClass:(Class)cls {
    for (Class tcls = object_getClass((id)self); tcls; tcls = tcls->superclass) {
        if (tcls == cls) return YES;
    }
    return NO;
}

- (BOOL)isKindOfClass:(Class)cls {
    for (Class tcls = [self class]; tcls; tcls = tcls->superclass) {
        if (tcls == cls) return YES;
    }
    return NO;
}
总结:
a isKindOfClass:A       a的isa指向的类是否等于A
b isMemberOfClass:B   b的isa指向的类是否等于B或者B的子类

相关文章

网友评论

      本文标题:Runtime

      本文链接:https://www.haomeiwen.com/subject/pfchkltx.html