我在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];
}
我想知道为什么
他们首先在viewDidUnload中将mapAnnotation设置为nil,然后以dealloc方法释放它们
为什么他们在使用和不使用self时使用mapAnnotation。
这是可下载的示例:MapCallouts Example
答案 0 :(得分:2)
你应该问的问题是:viewDidUnload
何时被召唤?
简而言之,它是在低内存情况下调用的,在这种情况下你不想释放整个控制器,即当不想要调用dealloc
时。
您可以认为viewDidUnload
与viewDidLoad
的{{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将减少保留属性的保留计数。