一个Student类中包含name属性和print方法 如图2
图一中方法执行 请问是否会崩溃
图1 图2并不会崩溃 但会打印如图3
图3obj->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字节 内存地址对应不上 则会崩溃
网友评论