Fork me on GitHub

OC基础学习:对象在内存中是如何存储的?

例:Person *p1 = [Person new];

  1. Person *p1; 会在栈内存中申请一块空间,在栈内存中声明1个Person类型的指针变量p1。p1是一个指针变量,那么只能存储地址。
  2. [person new]; 真正在内存中创建对象的其实是这句代码。
  3. new方法在堆内存中创建一块合适大小的空间,然后在空间中根据类的模板创建对象。
    类模板中定义了什么属性,就把这些属性依次声明在对象之中。
    对象中还有另外一个属性,叫做isa ,是一个指针,指向对象所属的类在代码段中的地址。(类中的isa指向父类)
  4. 初始化对象的属性,给对象的属性赋默认值。
    如果属性的类型是基本数据类型,那么就赋值为0
    如果属性的类型是c语言的指针类型,那么就赋值为NULL
    如果属性的类型为OC语言的类指针类型,那么就赋值为nil
  5. 注意
    1). 对象中只有属性没有方法,属性包括自己类的属性,外加一个isa指针指向代码段中的类。
    2). 如何访问对象的属性,指针名->属性名
    根据指针,找到指针指向的对象,在找到对象中的属性来访问。
    3). 如何调用方法。[指针名 方法名];
    先根据指针名找到对象,对象发现要调用方法,在根据对象的isa指针找到类。然后调用类里的方法。
    4). 为什么不把方法存储到对象之中。
    因为每一个对象的方法的代码实现都是一模一样的,没有必要为每一个对象都保存一个方法,这样的话就太浪费空间了,既然都一样,那么就只保存一份在代码段中。
    5). 对象属性是有默认值的。

参考: OC-基础总结(一)

坚持原创技术分享,您的支持将鼓励我继续创作!
  • 本文标题: OC基础学习:对象在内存中是如何存储的?
  • 本文作者: AndyRon
  • 发布时间: 2017年10月26日 - 11:13
  • 最后更新: 2019年09月04日 - 11:28
  • 本文链接: http://andyron.com/2017/oc-memory.html
  • 版权声明: 本博客所有文章除特别声明外,均采用 CC BY-NC-SA 3.0 许可协议。转载请注明出处!
0%