iOS:我为什么要首先在viewDidUnload中释放dealloc然后释放dealloc方法?

时间:2011-05-12 16:36:12

标签: ios ios4

我在Apple文档页面上找到了一个示例,在这个示例中,他们按如下方式释放内存:

- (void)viewDidUnload
{
  self.mapAnnotations = nil;
  [super viewDidUnload];

  // Relinquish ownership of anything that can be recreated in viewDidLoad or on demand.
  // For example: self.myOutlet = nil;
}

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

我想知道为什么

  1. 他们首先在viewDidUnload中将mapAnnotation设置为nil,然后以dealloc方法释放它们

  2. 为什么他们在使用和不使用self时使用mapAnnotation。

  3. 这是可下载的示例:MapCallouts Example

3 个答案:

答案 0 :(得分:2)

你应该问的问题是:viewDidUnload何时被召唤?

简而言之,它是在低内存情况下调用的,在这种情况下你不想释放整个控制器,即当想要调用dealloc时。

您可以认为viewDidUnloadviewDidLoad的{​​{1}}相反,而loadView则与dealloc相反。 (实际上它可能比当然要复杂一点。)

答案 1 :(得分:2)

viewDidUnload可以被认为是viewDidLoad的反面。在由于内存警告而卸载视图的情况下调用它,但视图控制器实际上没有被释放。

它允许您释放仅在加载视图时相关的内存,因此允许您在这些低内存条件下释放内存。

至于两个版本之间的差异,一个使用self而另一个不使用:

viewDidUnload方法中,变量通过其访问器方法设置为nil。变量已声明为属性,可能具有retain属性。通过属性分配nil时,它在功能上与以下代码相同:

- (void)setMyObject:(MyObject *)object
{
    [myObject release];
    myObject = [object retain];
}

因此,如果您将nil传递给该方法,您将释放旧实例并为变量分配nil。在释放后分配nil被认为是一种良好做法,可以防止尝试取消引用dangling pointer的任何可能性。

dealloc方法中,直接访问变量,而不是通过访问器方法或属性,并且释放变量。此时并不需要分配nil,因为拥有对象将被释放并且不会访问其任何指针,从而使得悬空指针的解除引用的可能性非常低。

答案 2 :(得分:0)

(1)这样做是为了让你可以放弃引用,这样系统就可以在内存不足的情况下解除分配资源。它是viewDidLoad的倒数:

(2)如果您使用点表示法来引用自我,您可能会创建一个对象,该对象是属性的实现细节。使用该名称可确保释放对象本身,而不释放属性返回的对象。在第一个例子中,在出口的情况下,用点符号(self。)指定nil将减少保留属性的保留计数。