我应该在dealloc中放置我的活动指示器发布声明吗?

时间:2011-07-10 06:19:04

标签: objective-c ios memory-management

我有一个非常简单的问题。在下面的代码中,最好将活动指示符放在dealloc中,因为我在启动并在将活动指示符添加到子视图后停止它?

- (void)viewDidLoad {
    [super viewDidLoad];
    // add activity indicator
    activityIndicator = [[UIActivityIndicatorView alloc] initWithActivityIndicatorStyle:UIActivityIndicatorViewStyleGray];
    activityIndicator.center = CGPointMake(self.view.bounds.size.width / 2.0f, self.view.bounds.size.height / 2.0f);

    activityIndicator.hidesWhenStopped = YES;
    [self.view addSubview:activityIndicator];
    [activityIndicator release];      // SHOULD THIS BE PLACED IN DEALLOC?

    [self loadFax];
}

3 个答案:

答案 0 :(得分:2)

实际上,除了dealloc之外,我还会将该版本放在viewDidUnload中。

如果您的应用收到内存警告且所有视图都已释放,则不这样做可能会导致内存泄漏;实际上,在这种情况下,视图将在需要时再次加载,这将导致为您的活动指示器进行第二次分配,而不会释放先前的实例。

请注意,根据下面的评论,在viewDidUnload中发布并不意味着您可以跳过在dealloc中释放。这有两个原因:如果您正在运行iOS 2.x没有viewDidUnload;此外,当您的视图控制器正常释放时,将不会调用viewDidUnload。因此建议在两个地方都做,并且不要忘记在做完之后将ivar值设置为nil。

在这种情况下,最好像你一样发布,但至少将ivar值设置为nil,否则你可能认为你仍然拥有该对象。

如果您使用了retain属性并按照以下方式进行了分配:

  Self.activityIndicator = ....

情况并非如此,我认为在viewDidUnload中发布你在viewDidLoad中创建的内容通常是更好的做法。

Here有关viewDidUnload的文档。

答案 1 :(得分:1)

是的,如果您计划在随机时间在整个视图中使用activityIndi​​cator,dealloc将是一个不错的选择。

答案 2 :(得分:1)

我会在使用时释放它,每次需要时都会创建一个新的。这样你就没有分配的内存块无用了。让自己成为指标的代表,并在完成后将其释放。