美文网首页
runtime一个面试题

runtime一个面试题

作者: 伪装C | 来源:发表于2019-06-25 16:48 被阅读0次

    一个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一个面试题

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