- Java 双重比较
- java - 比较器与 Apache BeanComparator
- Objective-C 完成 block 导致额外的方法调用?
- database - RESTful URI 是否应该公开数据库主键?
Apple 模板在 viewDidUnload 中提供了这条评论:
//释放主视图的所有保留 subview 。
//例如self.myOutlet = nil;
所以我通常在 viewDidUnload 中将 IB Outlets 设置为 nil
,然后在 dealloc
中释放它们。问题是,我其他所有保留的ivar对象,有的是编程添加的 View ,有的是数据模型,是不是也应该在这两种方法中处理?如果不是,为什么不呢?
来自这个答案here我收集到只有与 View 相关的对象应该作为 =nil
语句进入 viewDidUnload
,这应该可能包括非 IB Outlet
保留 View ,正确?然后,所有其他对象,包括数据模型,都应该作为 release
语句进入 dealloc
。这是正常做法吗?
最佳答案
viewDidUnload 由于内存不足而被调用,以卸载当前不可见的 View Controller 的 View 。此时, View Controller 的 View 对象已被释放,这意味着作为 viewController.view 的 subview 的所有对象都已被释放,但如果您将它们保留在 ivar 中,则它们不会被释放。
您应该释放任何将在再次加载 View 时重新创建的对象,或者您可以根据需要轻松重新创建的对象。下次使用该 View 时,将从 NIB 或通过调用 loadView 重新创建 View ,以便重新创建您释放的所有内容。
当您的 View 来自 NIB 时,所有在 NIB 中指定的 View 对象都被创建并添加为 View Controller View 的 subview 。任何具有 IBOutlets 的 ivars 也连接到这些 subview ,因此您也“拥有”这些对象(您对它们有保留)。您需要释放这些 ivar,以便它们真正得到释放。
当您的 View 在 loadView 中以编程方式创建时,您还应该释放由 ivars 保留的那些对象,这些对象将在下次加载 View 时在 loadView 中重新创建。
同样适用于您在 viewDidLoad(或 viewWillAppear 或其他地方)中创建的任何内容,例如数据模型,如果您可以在稍后再次加载 View 或需要对象时“轻松”地重新创建它,那么它应该在 viewDidLoad 中释放到减少内存使用。实际上对于非 View 项目,比如数据模型,我会改为在 didReceiveMemoryWarning 中发布它。
使用 setter 将 nil 分配给保留的属性会导致向它们发送释放,当您编写 self.myOutlet = nil
时,您正在调用 setter 方法,该方法的实现如下:
-(void)setMyOutlet:(id)newObject
{
[newObject retain]; // does nothing if newObject is nil
[myOutlet release];
myOutlet = newObject;
}
关于objective-c - 在 viewDidUnload 中释放多少,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7196857/
模板似乎创建了 [super viewDidUnload] 但代码示例显示: [super dealloc] 有区别吗? 最佳答案 您应该只调用父类(super class)的 -viewDidUnl
我的问题是这样的: 父类加载 subview 。 子级在执行操作期间使用“removeFromSuperView”删除自身。 当子类被移除时,父类会获得委托(delegate)调用,从而使子对象为零。
也许这是一个不好的做法,但从我阅读的文档中,我得到了在某些情况下在 viewDidLoad 方法内初始化对象并在 viewDidUnload 中将其置零的建议。 例如,如果您有添加观察者之类的内容 [
我知道以前有人问过类似的问题。但是我已经搜索了一段时间了,事情仍然有些困惑。所以这里... 我没有使用 ARC。 如果您有一个带有实例变量和如下属性的 View Controller : View C
我在读一本书,它建议将我的 IBOutlets 声明为 weak 应该可以解决当我的应用程序收到内存不足警告时的问题。例如,我现在不再需要在 viewDidUnload 方法中将这些 socket 设
viewDidUnload 的最佳实践是什么?仅将 IBOutlets 设置为 nil 还是将每个实例变量也设置为 nil(之前释放)? 提前致谢。 最佳答案 在设置为 nil 之前释放实例变量。不过
在我的应用程序中,我有一个 UIImagePicker,它不断抛出内存警告级别 1(最低)。然后它不断搞乱我的应用程序,因为它正在调用 viewdidunload 或 viewwillunload。当
我正在尝试禁用选项卡栏上除第一个选项卡之外的所有选项卡。我想出了这段代码: -(void)disableMainTabBar{ [self setSelectedIndex:0];
我试图弄清楚如何挂接到控件的 super View 上的ViewDidUnload。为了说明我为什么需要这个,请考虑我的 ControlFactory 类,它生成 UIButton(以及其他控件):
我一直在阅读“iPhone 4 开发入门”一书,他们有一个使用导航 Controller 的教程。在本教程中,我们将 View Controller (名为 childController)推送到 V
注意:我看到前面有人问了几个问题,但似乎没有一个能澄清我的疑问。 在 iOS6 之前,所有 socket ,图像和声音等大量资源在 viewDidUnload 中设置为 nil。在 iOS6 之后,情
如果我有一个 viewController 设置如下: @interface MapViewController : UIViewController { CLLocationManager
我是 iPhone 开发新手。 我在我的应用程序中使用一些按钮和标签。我将在 dealloc 函数中释放所有这些按钮和标签。 我也在 viewDidUnload 中释放它们。 - (void)view
摘自 Apple 的 View Controller 编程指南/高效管理内存; didReceiveMemoryWarning Use this method to deallocate all no
我倾向于在 -dealloc 中释放我的东西,现在 iPhone OS 3.0 引入了这个有趣的 -viewDidUnload 方法,他们说: // Release any retained subv
注意:此问题已过时 - viewDidUnload 已在 iOS 6 中弃用。 什么时候UIViewController的viewDidUnload会自动被调用?是的,我知道,当 View 卸载时。但
我刚刚安装了新版本的Xcode/ios6。 viewDidUnload 现已弃用。 在苹果文档中, viewDidUnload [...] Deprecated in iOS 6.0. Views a
当我移动到另一个 View 时,我可以使用哪种方法来捕获事件? 到目前为止我尝试过但没有成功的方法:viewWillDisappear: , willMoveToParentViewControlle
我一直在开发一个应用程序,我读的书说将这些语句放入 viewDidUnload 和 dealloc 方法中。还有什么其他信息应该放在这里?我的程序中有按钮和标签。我需要为他们做些什么吗? 我想要一个高
我遇到了一个非常有趣的情况,不知道如何解决它。我将首先概述我的程序的体系结构。我有一个 UITableViewController 派生类,它也实现了我的委托(delegate)协议(protocol
我是一名优秀的程序员,十分优秀!