Iphone IBOutlet成员变量是否自动保留?
奇怪的发现,当我使用拖放创建一个新的IBOutlet时,如下图所示,根本不使用@property: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!这与我所知道的关于内存管理
@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。