为什么在Objective-C对象初始化中需要alloc?

时间:2013-08-14 19:56:41

标签: objective-c alloc

我一直在浏览Objective-C中的一些教程,当涉及到命令alloc()以及它如何用于初始化对象时,我很困惑。

教程说要做以下事情,我无法弄清楚为什么有必要。

更改

NSDate *now = [NSDate date];

NSDate *now = [[NSDate alloc] init];

为什么这个改变是必要的,因为第一行工作正常?我想我正在寻找两条线的差异。谢谢!

4 个答案:

答案 0 :(得分:9)

有一个简单的区别和一个更深的区别。

简单的答案是第一种方法在内部包含+alloc / -init对 - 文档告诉我们它返回一个初始化为当前时间的新日期对象。通常,在某个地方,有人必须调用某种+alloc-init方法。有时那就是你,有时候为你准备了便利方法。

关于差异的更深层答案是+alloc / -init返回一个由调用者拥有的对象,然后负责在某个时刻调用-release,而方便构造函数不以“alloc”或“new”开头的单词返回您不必释放的自动释放对象。但是,如果您使用ARC,这主要是学术性的,因为编译器会为您跟踪该详细信息。

答案 1 :(得分:4)

分解:

NSDate是一个班级。因此NSDate alloc是对类方法alloc的调用。这实际上是从NSObject继承的,用于为NSDate的新实例创建足够的存储空间,然后将其作为实例返回。

(instance) init是对实例方法init的调用。在调用init之前,您收到的实例不能保证处于有效状态。调用init或相关的初始化程序会为实例提供建立自己的机会。

NSDate还选择提供类方法date。这与[[[NSDate alloc] init] autorelease]的作用相同,仅作为简写提供。

正如其他海报所评论的那样,这里存在语义差异 - alloc返回一个拥有的引用。因此,调用者有责任稍后release该对象。 date返回非拥有引用。所以来电者没有责任。然而,现代ARC编译器将处理为您发布的事情。所以有区别,但不会对你有任何实际影响。

如果您的教程坚持认为date更合适,那么它既可以在ARC编译器之前编写,也可以由喜欢使用旧约定的人编写;使用date传统上会传达您创建的内容是为了暂时使用,因此对于有经验的开发人员而言,可以说是单向的另一个值。

答案 2 :(得分:3)

使用ARC无关紧要,因为您不再需要释放分配init的对象。

没有ARC的重要区别:

[NSDate date] 

在NSDate上使用类方法返回一个自动释放的对象。

[[NSDate alloc] init] 

返回一个非自动释放的对象实例,保留计数为。

与非ARC一样,您需要掌握内存管理,因此,alloc init是更好的选择。所以,一旦不需要,就可以释放它。

还有一点需要注意,自动释放池是在自动释放池中释放的。

当您分配init时,您知道您的对象将一直存在,直到您释放它为止(或者因为它超出范围而泄漏它)。

答案 3 :(得分:0)

根本不需要进行更改。使用alloc+init或使用便捷方法创建对象无关紧要。将它们视为遗留和便利方法