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

2021-06-22  本文已影响0人  codeJ
调用一个类的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];无法对这个方法重写;
上一篇下一篇

猜你喜欢

热点阅读