以编程方式创建的子视图和viewDidUnload

Set*_*ein 2 iphone memory-management objective-c ios

对于视图控制器,必须释放在Interface Builder中设置的任何出口,并在viewDidUnload中将其设置为nil ,并且还必须在dealloc中释放.

(请参阅:我何时应该在viewDidUnload中而不是在dealloc中释放对象?)

实现[ viewDidUnload ] 的最重要原因之一是UIViewController子类通常还包含对视图层次结构中各种子视图的拥有引用.例如,这些属性可以在从nib加载时通过IBOutlets设置,或者loadView [强调添加] 内部以编程方式设置.

我的问题是,我们是否真的需要为视图层次结构中的子视图实现viewDidUnload,这些子视图是在loadView中以编程方式创建的(没有Interface Builder)?

hun*_*eth 5

这取决于您如何创建它们以及是否需要在其他地方引用它们.

例如:

- (void)loadView
{
    [super loadView];

    UIButton *someButton = [UIButton buttonWithType:UIButtonTypeRoundedRect];
    someButton.frame = CGRectMake(0, 0, 50, 50);
    [self.view addSubview: someButton];
}
Run Code Online (Sandbox Code Playgroud)

在上面的例子中,您不需要实现viewDidUnload,因为someButton是在loadView中自动释放的.

另一个例子:

- (void)loadView
{
    [super loadView];

    self.someButton = [UIButton buttonWithType:UIButtonTypeRoundedRect];
    someButton.frame = CGRectMake(0, 0, 50, 50);
    [self.view addSubview: someButton];
}
Run Code Online (Sandbox Code Playgroud)

在这个例子中,你会想要使用viewDidUnload,因为你有另一个对someButton的引用.您希望viewDidUnload释放该按钮并重置引用,这样您就不会不正确地使用它以及释放内存.在这种情况下,您还希望在dealloc方法中释放按钮,以防从未调用viewDidUnload.