IBOutlet成员变量会自动保留吗?

时间:2011-06-27 22:28:11

标签: iphone xcode memory-management interface-builder

奇怪的发现,当我使用拖放来创建一个新的IBOutlet时,如下所示,而不是@property:

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

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

我认为苹果必须知道关于这个东西的一两件事,那么幕后发生的事情是什么?我从来没有从这些类型的IBOutlets泄漏,我从来没有发布它们。

2 个答案:

答案 0 :(得分:3)

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

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

答案 1 :(得分:1)

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

“当前的最佳做法”是将IBOutlet粘贴在属性而不是ivars上(请参阅here)。这清楚地表明了正在使用的内存管理模式,并且对拼写错误更具弹性(例如,如果你拼错了ivar)。