欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  移动技术

IOS开发之关于alloc 、init和new学习讲解

程序员文章站 2023-11-21 20:18:16
关于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分配的内存会和相关联的对象在内存地址中相靠近,利于内存读取,调用时消耗很少的内存,提升了程序处理速度

觉得还可以点个赞噢