1

我大约 8 个月前开始学习编程,从 C、OOP 开始,现在到 iOS,这是我的目标。在大多数情况下,一切都很顺利,我已经开始通过在 xcode 上编写小型应用程序来练习。只是像便利初始化器这样的小术语有时会让我失望。任何人都可以为我定义这个术语,并给我一个简单的例子来说明它的用法吗?我了解分配和初始化的概念,但我无法区分初始化程序和便利初始化程序。我在网上看过,但运气不太好。

任何帮助表示赞赏,谢谢

4

2 回答 2

3

基本上,便利初始化器/构造器是一个类(静态/非成员)方法,它返回一个类的实例。

这意味着,为了获取类的实际实例,您可以使用便利构造函数(或初始化程序)(如果提供),而不是显式分配对象。

它将取代标准alloc/ init(或initWith...)方式。

但...

在内存管理方面,它有着完全不同的含义!

您不拥有便利构造函数返回的对象。
这意味着您不必自己释放它。

例如,当您分配 a 时NSMutableArray

NSMutableArray * a = [ [ NSMutableArray alloc ] initWithCapacity: 10 ];

你调用了alloc。这意味着您必须释放该对象,因为您拥有它:

NSMutableArray * a = [ [ NSMutableArray alloc ] initWithCapacity: 10 ];

/* Some stuff here... */

[ a release ];

便利构造函数不是这种情况,因为对象将被自动释放(它会自动放置在当前的自动释放池中):

NSMutableArray * a = [ NSMutableArray arrayWithCapacity: 10 ];

/* Some stuff here... */
/* No need to release the array! */

基本上,这就是arrayWithCapacity便利构造函数的NSMutableArray作用:

+ ( NSMutableArray * )arrayWithCapacity: ( NSUInteger )capacity
{
    return [ [ [ NSMutableArray alloc ] initWithCapacity: capacity ] autorelease ];
}

注意最后对自动释放的调用吗?
这意味着该对象将在当前运行循环结束时自动释放,因此您不必自己做(当然,如果您不明确保留它)。

最后说明

你没有提到你是否使用ARC
我以为不是这样的。

当然,如果你使用ARC,这是完全不同的,因为保留/释放是自动完成的(大部分时间),基于变量限定符(强/弱)。

但即使使用ARC,您也应该知道引用计数是如何工作的。

于 2012-05-21T22:03:51.543 回答
0

我有同样的疑问,但现在解决了:https ://developer.apple.com/library/ios/documentation/general/conceptual/devpedia-cocoacore/MultipleInitializers.html

注意:如果上述链接失败,请阅读此备份:https ://gist.github.com/JeOam/9116926

于 2014-02-20T15:11:39.093 回答