iOS-开发

iOS OC对象内存结构考察

2020-10-05  本文已影响0人  Johnny_Z

今天看到一道有意思的面试题

@interface Sark : NSObject
@property (nonatomic, copy) NSString *name; 
- (void)speak;
@end
@implementation Sark
- (void)speak {
    NSLog(@"my name's %@", self.name); 
}
@end
@implementation ViewController 
- (void)viewDidLoad {
    [super viewDidLoad]; 
    id cls = [Sark class]; 
    void *obj = &cls;
    [(__bridge id)obj speak];
}
@end

问:上面代码会打印什么东西?
what? Are you kidding me?
我们先来看看运行结果

image.png
居然还能真的打印出来。既然结果都告诉你了,我们就来分析一下。

第一点:为什么能调用speak方法?

经过上面3点分析,我们不难得出obj可以是可以找到speak方法的

第二点:obj指向的内存结构是啥?(speak会输出啥?)

struct objc_super arg = {
        self,
        objc_getClass("ViewController")
    };
objc_msgSendSuper2(&arg, sel_registerName("viewDidLoad"));

至此其内存结构可以解析为


image.png

经过以上两点对内存结构的分析我们知道,当我们调用[(__bridge id)obj speak];时会将viewController的实例self打印出来;

总结 :考擦的知识点


上一篇 下一篇

猜你喜欢

热点阅读