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的子类
网友评论