iOS Runtime
2016-01-12 18:41
417 查看
Object-c Runtime
今日突然想起以前被问过有关runtime的问题,那时候只知道是运行时状态,其他一概不知。偶然看到一篇以题目为切入点的博文,感觉豁然开朗了许多(其实我是看了几乎一个下午)。
博客地址:http://chun.tips/blog/2014/11/08/bao-gen-wen-di-objective%5Bnil%5Dc-runtime(4)%5Bnil%5D-cheng-yuan-bian-liang-yu-shu-xing/
下面说说我自己的理解:
第一题:
@implementation Son : Father
- (id)init
{
self = [super init];
if (self)
{
NSLog(@"%@", NSStringFromClass([self class]));
NSLog(@"%@", NSStringFromClass([super class]));
}
return self;
}
@end
输出都是Son类
解释如下:当我们调用[self alloc]时,因为Son与父类都没有该方法,所以最后会找到主父类NSObject,告诉编译器为Son分配地址并初始化,(这里我看到一句很有启发的话,那就是super只是告诉编译器往父类中找),
,然后Son中没有class方法,所以最后还是在NSObject中找到,
-(Class)class{
return object_getClass(self);
}
因此[self class]就是调用object_msgSend,最后返回self类名即是Son,而[super class]就是调用的object_msgSendSuper,所以返回的也是self本身的类名。
第二题:
@interface Sark : NSObject
@end
@implementation Sark
@end
int main(int argc, const char * argv[]) {
@autoreleasepool {
BOOL res1 = [(id)[NSObject class] isKindOfClass:[NSObject class]];
BOOL res2 = [(id)[NSObject class] isMemberOfClass:[NSObject class]];
BOOL res3 = [(id)[Sark class] isKindOfClass:[Sark class]];
BOOL res4 = [(id)[Sark class] isMemberOfClass:[Sark class]];
NSLog(@"%d %d %d %d", res1, res2, res3, res4);
}
return 0;
}
输出:yes,no,no,no
- (BOOL)isKindOf:aClass
{
Class cls;
for (cls = isa; cls; cls = cls->superclass)
if (cls == (Class)aClass)
return YES;
return NO;
}
- (BOOL)isMemberOf:aClass
{
return isa == (Class)aClass;
}
NSObjetc的isa是指向Meta class of Object,而Meta class of Object的isa是指向自己的。
今日突然想起以前被问过有关runtime的问题,那时候只知道是运行时状态,其他一概不知。偶然看到一篇以题目为切入点的博文,感觉豁然开朗了许多(其实我是看了几乎一个下午)。
博客地址:http://chun.tips/blog/2014/11/08/bao-gen-wen-di-objective%5Bnil%5Dc-runtime(4)%5Bnil%5D-cheng-yuan-bian-liang-yu-shu-xing/
下面说说我自己的理解:
第一题:
@implementation Son : Father
- (id)init
{
self = [super init];
if (self)
{
NSLog(@"%@", NSStringFromClass([self class]));
NSLog(@"%@", NSStringFromClass([super class]));
}
return self;
}
@end
输出都是Son类
解释如下:当我们调用[self alloc]时,因为Son与父类都没有该方法,所以最后会找到主父类NSObject,告诉编译器为Son分配地址并初始化,(这里我看到一句很有启发的话,那就是super只是告诉编译器往父类中找),
,然后Son中没有class方法,所以最后还是在NSObject中找到,
-(Class)class{
return object_getClass(self);
}
因此[self class]就是调用object_msgSend,最后返回self类名即是Son,而[super class]就是调用的object_msgSendSuper,所以返回的也是self本身的类名。
第二题:
@interface Sark : NSObject
@end
@implementation Sark
@end
int main(int argc, const char * argv[]) {
@autoreleasepool {
BOOL res1 = [(id)[NSObject class] isKindOfClass:[NSObject class]];
BOOL res2 = [(id)[NSObject class] isMemberOfClass:[NSObject class]];
BOOL res3 = [(id)[Sark class] isKindOfClass:[Sark class]];
BOOL res4 = [(id)[Sark class] isMemberOfClass:[Sark class]];
NSLog(@"%d %d %d %d", res1, res2, res3, res4);
}
return 0;
}
输出:yes,no,no,no
- (BOOL)isKindOf:aClass
{
Class cls;
for (cls = isa; cls; cls = cls->superclass)
if (cls == (Class)aClass)
return YES;
return NO;
}
- (BOOL)isMemberOf:aClass
{
return isa == (Class)aClass;
}
NSObjetc的isa是指向Meta class of Object,而Meta class of Object的isa是指向自己的。
相关文章推荐
- [iOS]NSHashTable和NSMapTable用法
- iOS Xcode 打包之后,不能输出日志
- 【学习总结】iOS 数据保存几种方式总结
- 【转】iOS学习笔记(十七)——文件操作(NSFileManager)
- 修改navigationBar的title颜色
- iOS界面调试工具--Reveal
- iOS 9 Auto Layout界面自动布局系列-自适应布局
- IOS本地,APNS远程推送(具体过程)
- iOS MRC下对象 retainCount=0后 还可以使用一次
- iOS~block的使用
- iOS开发的一些奇巧淫技
- 引导页实现ScrollView左右无缝滚动
- iOS bundle
- iOS RC4加解密算法
- runtime Method
- iOS轮播图
- IOS-TextField知多少
- 160112iOS 统计错误报告分析工具 (dSYM 文件分析)
- win7搭建ios开发环境
- iOS越狱开发环境搭建 theos