为什么我不应该将 alloc 和 init 分开?

2023-12-10

Objective-C 中初始化和分配的正常方法是

NSObject *someObject = [[NSObject alloc] init];

为什么不实行以下内容?

NSObject *someObject = [NSObject alloc];
[someObject init];

主要问题是您最终可能会使用错误的对象。

init在许多类中很特殊,因为它可能只是释放接收者并创建一个驻留在不同地址的新对象。所以你的someObjectthen 指向错误的(未初始化的)实例。

有很多框架类使用init方法来决定最好使用哪种专用子类。这种情况经常发生在类集群中,例如NSString or NSArray但每种物体都可能发生这种情况。

您可以在 ARC 中看到初始化程序的这种特殊行为:它显式声明 init 系列方法消耗接收器并返回 +1 保留对象。如果初始化程序总是返回接收者,则没有必要这样做。

当然,您可以通过执行另一项作业来修复代码:

NSObject *someObject = [NSObject alloc];
someObject = [someObject init];

这将解决问题。但这样做也没有任何意义。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

为什么我不应该将 alloc 和 init 分开? 的相关文章

随机推荐