【问题标题】:Why release a property that you've already set to nil?为什么要释放一个你已经设置为 nil 的属性?
【发布时间】:2011-07-02 16:53:06
【问题描述】:

以下是 Apple 教程中视图控制器中的两种方法:

- (void)viewDidUnload {
    self.eventsArray = nil;
    self.locationManager = nil;
    self.addButton = nil;
}

- (void)dealloc {
    [managedObjectContext release];
    [eventsArray release];
    [locationManager release];
    [addButton release];
    [super dealloc];
}

dealloc 方法不能缩短为以下吗?如果没有,为什么不呢?

- (void)dealloc {
    [managedObjectContext release];
    [super dealloc];
}

【问题讨论】:

    标签: objective-c ios


    【解决方案1】:

    不,因为您不能依赖 viewDidUnload 在解除分配时被调用。 viewDidUnload 仅在视图控制器在其视图不在屏幕上时收到内存警告时调用。如果视图控制器被释放,viewDidUnload 不会被调用(AFAIK,我不完全确定)。

    【讨论】:

      【解决方案2】:

      因为始终在 dealloc 中清理 ivars 是一个好习惯。可能会出错,或者您可能会遇到意外的执行。

      【讨论】:

        【解决方案3】:

        - (void)viewDidUnload 不能保证被调用,所以你也应该总是在 dealloc 中释放东西。

        请参阅this question 以了解何时调用它,以及调用时应该做什么。

        【讨论】:

          【解决方案4】:

          eventsArray 设置为nil 只是意味着它没有内容,但仍有内容空间 调用[eventsArray release] 会释放数组占用的空间。

          【讨论】:

          • 并非如此。如果eventsArray 是保留或复制属性,则将其设置为nil 会有效地释放支持对象(如果有)。
          猜你喜欢
          • 2023-03-12
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2019-05-23
          • 2021-02-22
          • 2021-10-19
          相关资源
          最近更新 更多