美文网首页
【iOS底层原理】alloc和init做了什么?

【iOS底层原理】alloc和init做了什么?

作者: zhang佩金 | 来源:发表于2021-06-22 22:20 被阅读0次
    调用一个类的alloc和init创建一个类的实例对象
    那么alloc和init底层究竟做了什么?
    #import "ViewController.h"
    
    @interface PJPerson:NSObject
    
    @end
    
    @implementation PJPerson
    
    @end
    
    @interface ViewController ()
    
    @end
    
    @implementation ViewController
    
    - (void)viewDidLoad {
        [super viewDidLoad];
        PJPerson *p1 = [PJPerson alloc];
        PJPerson *p2 = [p1 init];
        PJPerson *p3 = [p1 init];
        NSLog(@"%@,%p,%p",p1,p1,&p1);
        NSLog(@"%@,%p,%p",p2,p2,&p2);
        NSLog(@"%@,%p,%p",p3,p3,&p3);
    }
    
    @end
    
    打印结果是什么?
    2021-06-22 20:50:40.864206+0800 demo[1397:24614] <PJPerson: 0x600003e801f0>,0x600003e801f0,0x7ffeebbd5128
    2021-06-22 20:50:40.864308+0800 demo[1397:24614] <PJPerson: 0x600003e801f0>,0x600003e801f0,0x7ffeebbd5120
    2021-06-22 20:50:40.864394+0800 demo[1397:24614] <PJPerson: 0x600003e801f0>,0x600003e801f0,0x7ffeebbd5118
    
    除了&p1、&p2、&p3不一样,其他都一样
    

    &p1、&p2、&p3他们的地址相差8个字节,为什么?因为在栈上面去开辟内存空间然后是连续的并且是从高到低存储着p1、p2、p3,然后他们指向堆空间(存放PJPerson的实例对象)

    alloc是怎么开辟内存的?
    1:调用cls->instanceSize()计算需要多大的内存空间
    2:调用calloc()开辟内存,获的指针地址
    3:调用obj->initInstanceIsa()方法,绑定类和这个指针进行关联
    
    init和new的方法区别?
    init:什么也没做就是直接返回self,一般重写这个方法进行初始化;
    new:底层调用callAlloc(),相当于alloc] init];无法对这个方法重写;
    

    相关文章

      网友评论

          本文标题:【iOS底层原理】alloc和init做了什么?

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