Iphone IBOutlet成员变量是否自动保留?

Iphone IBOutlet成员变量是否自动保留?,iphone,xcode,memory-management,interface-builder,Iphone,Xcode,Memory Management,Interface Builder,奇怪的发现,当我使用拖放创建一个新的IBOutlet时,如下图所示,根本不使用@property: @interface SkinChoosingView : UIViewController { IBOutlet UIActivityIndicatorView * activityIndicator; } Xcode插入了一个-release,并在viewDidUnload中将插座设置为nil。但是我在viewDidLoad中查看了一下,没有-retain!这与我所知道的关于内存管理

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

@interface SkinChoosingView : UIViewController {
    IBOutlet UIActivityIndicatorView * activityIndicator;
}
Xcode插入了一个
-release
,并在
viewDidUnload
中将插座设置为nil。但是我在viewDidLoad中查看了一下,没有
-retain
!这与我所知道的关于内存管理的一切都背道而驰


我想苹果一定知道一两件关于这件事的事情,所以这里有什么幕后发生的事情吗?我从未从这些类型的iboutlet中泄漏过,也从未释放过它们。

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


由于它为您保留了插座,您必须在
viewDidLoad
中释放,因为插座将在下次调用
viewDidLoad
时重新加载

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


由于它为您保留了插座,您必须在
viewDidLoad
中释放,因为插座将在下次调用
viewDidLoad
时重新加载

答案是它使用了“键值涂层”,这意味着它调用了
-setValue:forKey:
,它有一个。对于ivar,它执行类似于
[ivar自动释放];ivar=[newvalue retain]


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

答案是它使用了“键值Coading”,这意味着它调用了
-setValue:forKey:
,它具有。对于ivar,它执行类似于
[ivar自动释放];ivar=[newvalue retain]


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

但是,如果我根本没有声明属性,它还会保留吗?(除了保留它作为子视图得到的内容)我通常使用上面的声明来进行弱引用,对于视图消失后我不需要引用的内容,我以前从未有过泄漏。是的,我想我刚才提到过。如果您想创建弱引用,您应该将其声明为
assign
属性。但是如果我根本没有声明属性,它还会保留吗?(除了保留它作为子视图得到的内容)我通常使用上面的声明来进行弱引用,对于视图消失后我不需要引用的内容,我以前从未有过泄漏。是的,我想我刚才提到过。如果要创建弱引用,应该将其声明为
assign
属性。我想这就解释了
retain
的来源。从我尝试的一个测试中,它实际上额外保留了三次,并在连接了插座的情况下释放了两次,给出了阻止它释放的净+1。我想这就解释了
retain
的来源。从我试过的一个测试中,它实际上额外保留了三次,并且在连接了一个插座的情况下额外释放了两次,给出了阻止它释放的净+1。