美文网首页
题目小记

题目小记

作者: 过江鸟iOSer | 来源:发表于2019-04-11 17:06 被阅读0次

    1. Objective-C 对象是什么?Class 是什么?id 又是什么?

    在 Objective-C 中,每一个对象是一个结构体,每个对象都有一个 isa 指针,类对象 Class 也是一个对象。所以,我们说,凡是包含 isa 指针的,都可以被认为是 Objective-C 中的对象。运行时可以通过 isa 指针,查找到该对象是属于什么类(Class)。

    2. isa 是什么?为什么要有 isa?

    (1)isa 的作用:用于查找对象(或类对象)所属类(或元类)的信息,比如方法列表。
    (2)isa 是什么:isa 的数据结构是一个 isa_t 联合体,其中包含其所属的 Class 的地址,通过访问对象的 isa,就可以获取到指向其所属 Class 的指针(针对 tagged pointer 的情况,也就是 non-pointer isa,有点不一样的是,除了指向 class 的指针,isa 中还会包含对象本身的一些信息,比如对象是否被弱引用)。

    3. 为什么在 Objective-C 中,所有的对象都用一个指针来追踪?

    内存中的数据类型分为两种:值类型和引用类型。指针就是引用类型,struct 类型就是值类型。
    值类型在传值时需要拷贝内容本身,而引用类型在传递时,拷贝的是对象的地址。所以,一方面,值类型的传递占用更多的内存空间,使用引用类型更节省内存开销;另一方面,也是最主要的原因,很多时候,我们需要把一个对象交给另一个函数或者方法去修改其中的内容(比如说一个 Person 对象的 age 属性),显然如果我们想让修改方获取到这个对象,我们需要的传递的是地址,而不是复制一份。
    对于像 int 这样的基本数据类型,拷贝起来更快,而且数据简单,方便修改,所以就不用指针了。
    另一方面,对象的内存是分配在堆上的,而值类型是分配到栈上的。所以一般对象的生命周期会比普通的值类型要长,而且创建和销毁对象以及内存管理是要消耗性能的,所以通过指针来引用一个对象,比直接复制和创建对象要更有效率、更节省性能。

    相关文章

      网友评论

          本文标题:题目小记

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