IOS开发之关于alloc 、init和new学习讲解
程序员文章站
2022-05-26 16:08:02
关于oc的很多基础概念总是看了又看,却忘了又忘,脑海里大多只是一个笼统的概念,现在正好放假有空,腾出手来记录一下。
1.alloc和init经常放在一起写,它们分别有什么作用呢?
在初始化一个对象的...
关于oc的很多基础概念总是看了又看,却忘了又忘,脑海里大多只是一个笼统的概念,现在正好放假有空,腾出手来记录一下。
1.alloc和init经常放在一起写,它们分别有什么作用呢?
在初始化一个对象的时候,我们都知道要这样写
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语句内为子类新增属性初始化,完成初始化工作后返回。
2.alloc 和 allocwithzone 有什么区别呢?
一般情况下 alloc 和 allocwithzone 的作用是一样的。
也就是说
myclass * a = [[my class alloc]init]; myclass * b = [my class allocwithzone :nil];
a isequal b =1;
所以alloc和allocwithzone都可以用于创建实例,实际上alloc会默认调用allocwithzone方法。
3.new又是啥?
new方法等同[alloc]init,实际上[alloc]init在alloc的时候调用了allocwithzone分配了内存,然后调用init初始化,new在分配内存后直接调用init进行初始化,一步到位。
4.new能一步到位,那为什么它却使用的很少?
原因有两点:
1是因为new能一步到位,但它只能init,而alloc init却有更多五花八门又实用或者定制的初始化方法。
2alloc ,init分配的内存会和相关联的对象在内存地址中相靠近,利于内存读取,调用时消耗很少的内存,提升了程序处理速度
觉得还可以点个赞噢