首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >什么时候我应该在-(空)viewDidUnload而不是-dealloc中释放对象?

什么时候我应该在-(空)viewDidUnload而不是-dealloc中释放对象?
EN

Stack Overflow用户
提问于 2009-07-21 12:08:51
回答 4查看 30.5K关注 0票数 102

-(void)viewDidUnload有什么好处?

我能不能在-dealloc中重新发布所有的东西?如果视图确实卸载了,-dealloc不会被调用吗?

EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2009-07-21 17:11:37

除了已经指出的内容之外,我还想更详细地阐述-viewDidUnload背后的逻辑。

实现它的一个最重要的原因是,UIViewController子类通常还包含对视图层次结构中各种子视图的引用。例如,这些属性可以在从nib加载时通过IBOutlets设置,或者在-loadView中以编程方式设置。

UIViewController对子视图的额外所有权意味着,即使将其视图从视图层次结构中移除并释放以节省内存,实际上也不会释放子视图,因为UIViewController本身仍然包含对这些对象的未完成保留引用。释放这些对象的UIViewController额外所有权可确保它们也将被释放以释放内存。

UIViewController视图为re-loaded时,您在这里释放的对象通常会重新创建并重新设置,无论是从Nib还是通过-loadView的实现。

另请注意,在调用此方法时,UIViewController view属性为nil

票数 50
EN

Stack Overflow用户

发布于 2010-07-16 06:39:37

这是因为您通常会将@property设置为"(nonatomic, retain)",因此为您创建的setter将释放当前对象,然后保留参数,即

self.property = nil;

...does某物大致如下:

[property release];
property = [nil retain];

因此,您是一举两得:内存管理(释放现有对象)和将指针赋给nil (因为向nil指针发送任何消息都将返回nil)。

希望这能有所帮助。

票数 8
EN

Stack Overflow用户

发布于 2010-08-10 01:11:21

如果视图控制器从导航控制器堆栈中弹出,并且没有保留在其他位置,它将被释放,并且将调用dealloc而不是viewDidUnload。您应该在dealloc中释放在loadView中创建的视图,但没有必要将变量设置为nil,因为在调用dealloc后不久,这些变量将不再存在。

票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/1158788

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档