runtime一个面试题

一个Student类中包含name属性和print方法 如图2

图一中方法执行 请问是否会崩溃

图1
图2

并不会崩溃 但会打印如图3

图3

obj->cls->[Student class]

正常调用时 声明的Student类属性student -> isa -> [Student class]

内存结构相同 所以可以调用print方法 可以理解 cls即是isa


函数调用 是通过查找isa 其本质是查找结构体的前8个字节 

前8个字节正好是isa 所以可以理解为 cls == isa


那为何会打印 viewcontroller?

局部变量是分配在栈中 栈的内存分配是从高地址到低地址 栈的内存分配是连续的

要打印的name 成员变量 是通过self-> 去查找 

[(__bridge id)obj print] 即是通过obj开始查找

而name 是通过指针地址查找 需要查找Student结构体

Student中就两个变量 所以找name 就是找到isa 再跳过8个字节 及是name

前面解释道cls和isa指向同一地址 所以跳过8个字节即是[super viewdidload]

如果再添加其他属性 则不一定找得到值 会崩溃

打印结果

&cls 即obj指向的内存是Strudent结构体isa地址 isa指针占用8字节 

跳过8字节即和str地址相同 则title的值时abc 

而name NSstring*占用8字节 str1 是int类型占用4字节 内存地址对应不上 则会崩溃

你可能感兴趣的:(runtime一个面试题)