如果您遵循现在被认为是最佳实践的方法,您应该释放 outlet 属性,因为您应该将它们保留在 set 访问器中:
@interface MyController : MySuperclass {
Control *uiElement;
}
@property (nonatomic, retain) IBOutlet Control *uiElement;
@end
@implementation MyController
@synthesize uiElement;
- (void)dealloc {
[uiElement release];
[super dealloc];
}
@end
这种方法的优点是它使内存管理语义明确和清晰,并且它在所有平台上对所有 nib 文件一致地工作。
注意:以下 cmets 仅适用于 3.0 之前的 iOS。对于 3.0 及更高版本,您应该简单地将 viewDidUnload 中的属性值设为 nil。
不过,这里需要考虑的一个问题是,您的控制器可能会处理其用户界面并根据需要动态重新加载它(例如,如果您有一个视图控制器从 nib 文件加载视图,但应请求 - 比如说在内存压力下——释放它,期望在再次需要视图时可以重新加载它)。在这种情况下,您要确保当主视图被处置时,您也放弃任何其他出口的所有权,以便它们也可以被解除分配。对于 UIViewController,您可以通过覆盖 setView: 来处理此问题,如下所示:
- (void)setView:(UIView *)newView {
if (newView == nil) {
self.uiElement = nil;
}
[super setView:aView];
}
不幸的是,这引发了另一个问题。因为 UIViewController 当前使用setView: 访问器方法实现其dealloc 方法(而不是简单地直接释放变量),self.anOutlet = nil 将在dealloc 中被调用以及响应内存警告......这将导致dealloc 崩溃。
补救措施是确保在dealloc中也将出口变量设置为nil:
- (void)dealloc {
// release outlets and set variables to nil
[anOutlet release], anOutlet = nil;
[super dealloc];
}