objective-c的alloc和init

objective-c的alloc和init,第1张

概述alloc 是在物理内存中分配了一块内存,并且返回一个指针。MyClass* myObj = [MyClass alloc];此时myObj还不能使用,因为它的内存状态还没有得到正确的设置。init 设置对象的初始化状态并且将其返回。注意:[a init] 的返回值并不一定是a自身 ,原因如下://init的源码-init{ self = [super init...

alloc 是在物理内存中分配了一块内存,并且返回一个指针。

MyClass* myObj = [MyClass alloc];

此时myObj还不能使用,因为它的内存状态还没有得到正确的设置。
init 设置对象的初始化状态并且将其返回。

注意:[a init] 的返回值并不一定是a自身 ,原因如下:

//init的源码-init{     self = [super init]; // 1.    if(self) // 2.     {           ....    }     return self; // 3.}

1. 首先,你需要调用超类的init 方法去设置超类的实例变量等,其返回值不不一定等于原来的self ,所以你需要将返回值重新赋值给self.

2.  如果self 非空,则表明被超类控制的部分已经得到正确的初始化。词时,所有的实例变量都设置为nil (如果是对象),或者0(如果是整型)。接下来,你可以执行额外的初始化设置。

3. 返回self

 

测试:

Nsstring *name = [Nsstring alloc];NSLog(@"%p",name);name = [name init];NSLog(@"%p",name);//打印出的两个的内存地址不一样,因为执行了self=[super init],重新分配了空间

不过:

NSObject *obj = [NSObject alloc];NSLog(@"%p",obj);obj = [obj init];NSLog(@"%p",obj);//打印出的两个地址是一样的,为什么呢?

NSObject打印出来的两个地址一样,这是为什么呢?

因为NSObject是一切类的基类,当[[Nsstring alloc]init]执行时,调用的[super init]就是 NSObject中的init方法,既然NSObject身为基类,它也就无法调用super init,所以当NSObject执行[[NSObject alloc]init]时,也就没有了init重新分配空间这一环节。

 

回归正题,因为initalloc的返回值不一定相等,所以不要将两个方法分开使用,如以下代码:

//不要这样写MyClass* myObj = [MyClass alloc]; [myObj init];

也不建议使用以下写法:

//不要这样写MyClass* myObj = [MyClass alloc]; myObj=[myObj init];

因为你很有可能忘记写myObj=
永远使用以下写法:

//要这样写 MyClass* myObj = [[MyClass alloc] init];

也不建议使用new 方法,因为

//new的源码+ new {     ID newObject = (*_alloc)((Class)self,0);     Class MetaClass = self->isa;     if (class_getVersion(MetaClass) > 1)         return [newObject init];     else         return newObject; }   

如果使用new的话,初始化方法被固定死只能调用init

采用alloc的方式可以用其他定制的初始化方法

所以不建议使用new 方法创建对象

 

参考:

https://www.cnblogs.com/chars/p/5194067.html

https://www.jianshu.com/p/a4859a37f59b

 

总结

以上是内存溢出为你收集整理的objective-c的alloc和init全部内容,希望文章能够帮你解决objective-c的alloc和init所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址:https://www.54852.com/web/999298.html

(0)
打赏 微信扫一扫微信扫一扫 支付宝扫一扫支付宝扫一扫
上一篇 2022-05-21
下一篇2022-05-21

发表评论

登录后才能评论

评论列表(0条)

    保存