对象 = [[XXX alloc] init];
alloc作用:为对象申请内存空间,内存空间的大小受属性影响;
init作用:将XXX class与内存空间大小进行关联;
ps:new函数基本上等同于[[XXX alloc] init],区别在于alloc会用到zone进行空间申请,会把对象分配到相邻的地址,提升性能。new里无法对对象进行initXXX等构造操作;
通过对libobjc.A.dylib源码进行分析,可以将alloc流程梳理为:
alloc ->_objc_rootAlloc ->callAlloc ->_objc_rootAllocWithZone -> _class_createInstanceFromZone
其中核心流程是在_class_createInstanceFromZone函数里:
1、instanceSize:计算对象需要多少字节,并以16字节对齐;
2、calloc:通过第1步的大小进行内存空间大小的申请;
3、initInstanceIsa:将对象与内存地址进行关联;