【问题标题】:What is a convenience initializer as it pertains to Objective-C?什么是与 Objective-C 相关的便利初始化程序?
【发布时间】:2012-05-21 21:42:49
【问题描述】:

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

感谢任何帮助,谢谢

【问题讨论】:

  • 标签延迟初始化完全是一种不同的技术......

标签: objective-c initialization lazy-initialization


【解决方案1】:

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

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

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

但是...

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

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

例如,当你分配一个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 ];
}

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

最后说明

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

当然,如果您使用 ARC,则完全不同,因为保留/释放是根据变量限定符(强/弱)自动完成的(大部分时间)。 p>

但即使使用 ARC,您也应该知道引用计数的工作原理。

【讨论】:

    【解决方案2】:

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

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

    【讨论】:

    • 虽然此链接可能会回答问题,但最好在此处包含答案的基本部分并提供链接以供参考。如果链接页面发生更改,仅链接的答案可能会失效。
    • @S.L.Barth 感谢您的评论!想加个图说明重点,但是我的否定性太低了……
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-05-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-02-18
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多