【问题标题】:Do IBOutlet member vars retain automatically?IBOutlet 成员变量会自动保留吗?
【发布时间】:2011-09-23 21:19:41
【问题描述】:

奇怪的发现,当我使用拖放创建一个新的 IBOutlet 时,如下所示,根本没有@property:

@interface SkinChoosingView : UIViewController {
    IBOutlet UIActivityIndicatorView * activityIndicator;
}

Xcode 插入了一个-release 并将viewDidUnload 中的出口设置为nil。不过,我查看了 viewDidLoad,但那里没有 -retain!这违背了我对内存管理的所有了解。

我认为苹果肯定对这些东西了解一两件事,那么这里发生了幕后的事情吗?我从来没有从这些类型的 IBOutlets 中泄漏过,我也从来没有发布过它们。

【问题讨论】:

    标签: iphone xcode memory-management interface-builder


    【解决方案1】:

    是的,它会在加载 NIB 文件时自动为您保留插座,除非您将与插座关联的属性显式声明为assigned 属性。

    由于它为您保留了出口,您必须在 viewDidUnload 中释放出口,因为出口将在下一次调用 viewDidLoad 时重新加载。

    【讨论】:

    • 但是如果我根本没有声明一个属性,它仍然保留吗? (除了作为子视图获得的保留之外)我通常使用上面的声明来进行弱引用,因为在视图消失后我不需要引用的东西,而且我以前从未有过泄漏。
    • 是的,我想我刚才提到了。如果要进行弱引用,则应将其声明为 assign 属性。
    【解决方案2】:

    答案是它使用“键值编码”,这意味着它调用-setValue:forKey:,它有一个"Default Search Pattern"。对于 ivars,它的作用类似于 [ivar autorelease]; ivar = [newvalue retain];

    “当前的最佳实践”是将IBOutlet 粘贴在属性而不是 ivars 上(请参阅here)。这使得正在使用的内存管理模式变得一目了然,并且对拼写错误更有弹性(例如,如果您拼错了 ivar)。

    【讨论】:

    • 我想这解释了retain 的来源。从我尝试过的测试中,它实际上保留了三个额外的时间,并在连接插座的情况下释放了两个额外的时间,给网络 +1 以防止它释放。
    猜你喜欢
    • 1970-01-01
    • 2012-06-08
    • 2010-11-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-09-09
    • 1970-01-01
    相关资源
    最近更新 更多