我一直在浏览Objective-C中的一些教程,当涉及到命令alloc()
以及它如何用于初始化对象时,我很困惑。
教程说要做以下事情,我无法弄清楚为什么有必要。
更改
NSDate *now = [NSDate date];
到
NSDate *now = [[NSDate alloc] init];
为什么这个改变是必要的,因为第一行工作正常?我想我正在寻找两条线的差异。谢谢!
答案 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
或使用便捷方法创建对象无关紧要。将它们视为遗留和便利方法。