美文网首页
下面的代码会?Compile Error / Runtime C

下面的代码会?Compile Error / Runtime C

作者: 凯旋之歌 | 来源:发表于2017-08-24 08:35 被阅读0次
@interface Sark : NSObject
@property (nonatomic, copy) NSString *name;
@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

编译运行正常,输出ViewController中的self对象。 编译运行正常,调用了-speak方法,由于

id cls = [Sark class];
void *obj = &cls;

obj已经满足了构成一个objc对象的全部要求(首地址指向ClassObject),遂能够正常走消息机制;

由于这个人造的对象在栈上,而取self.name的操作本质上是self指针在内存向高位地址偏移(32位下一个指针是4字节),按viewDidLoad执行时各个变量入栈顺序从高到底为(self, _cmd, self.class, self, obj)(前两个是方法隐含入参,随后两个为super调用的两个压栈参数),遂栈低地址的obj+4取到了self。

相关文章

网友评论

      本文标题:下面的代码会?Compile Error / Runtime C

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