关于OC的很多基础概念总是看了又看,却忘了又忘,脑海里大多只是一个笼统的概念,现在正好放假有空,腾出手来记录一下。
在初始化一个对象的时候,我们都知道要这样写
Myclass *a = [[Myclass alloc]init];
或者也可以分开写
Myclass *a = [Myclass alloc]; a = [new init];
alloc的作用如其英文含义一样,分配内存给对象,使对象不被释放,将地址返回给指针。
但是分配了内存后,这片内存还没有得到正确的初始化,就跟C中的malloc()函数分配了内存需要调用memset()函数进行初始化一样,OC中init就是为分配好的内存进行初始化。
因此在很多类方法中,我们需要这样写
self=[super init]; if(self){ } return self;
作用便是从父类中调用init方法为父类属性进行初始化,然后if语句内为子类新增属性初始化,完成初始化工作后返回。
一般情况下 alloc 和 allocwithZone 的作用是一样的。
也就是说
Myclass * a = [[My class alloc]init]; Myclass * b = [My class allocwithZone :nil];
a isEqual b =1;
所以alloc和allocWithZone都可以用于创建实例,实际上alloc会默认调用allocWithZone方法。
new方法等同[alloc]init,实际上[alloc]init在alloc的时候调用了allocWithZone分配了内存,然后调用init初始化,new在分配内存后直接调用init进行初始化,一步到位。
原因有两点:
1是因为new能一步到位,但它只能init,而alloc init却有更多五花八门又实用或者定制的初始化方法。
2alloc ,init分配的内存会和相关联的对象在内存地址中相靠近,利于内存读取,调用时消耗很少的内存,提升了程序处理速度
觉得还可以点个赞噢