objective-c的alloc和init

本文深入探讨了Objective-C中alloc和init方法的工作原理,解释了它们如何分配内存和初始化对象状态,以及为何不应将两者分开使用。同时,文章对比了不同类在执行初始化过程中的差异,特别是对于基类NSObject的行为进行了详细说明。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

林新发

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值