Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/ios/107.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ios 什么';释放插座的最佳和最安全的做法是什么?_Ios_Memory - Fatal编程技术网

Ios 什么';释放插座的最佳和最安全的做法是什么?

Ios 什么';释放插座的最佳和最安全的做法是什么?,ios,memory,Ios,Memory,iOS文档中说,您的视图控制器应该在-dealoc中释放任何保留的插座(零,因为这是良好的实践,实际上是2.x兼容性的必要条件) 文档还指出,如果您希望在视图不可见且发出内存警告时允许清理-viewDidUnload中的插座,则应该对其执行相同的操作 我想知道两件事: 这是否意味着我应该复制我所有的门店发布代码?把它全部放在-dealoc和-viewDidUnload中?这是一个真正的痛苦,保持和真正容易忘记 我是否保证在-viewDidUnload之后重新加载视图时,会重新填充我的所有出口,包

iOS文档中说,您的视图控制器应该在-dealoc中释放任何保留的插座(零,因为这是良好的实践,实际上是2.x兼容性的必要条件)

文档还指出,如果您希望在视图不可见且发出内存警告时允许清理-viewDidUnload中的插座,则应该对其执行相同的操作

我想知道两件事:

  • 这是否意味着我应该复制我所有的门店发布代码?把它全部放在-dealoc和-viewDidUnload中?这是一个真正的痛苦,保持和真正容易忘记
  • 我是否保证在-viewDidUnload之后重新加载视图时,会重新填充我的所有出口,包括引用nib中非视图对象的出口

  • 理想的答案回答了上述两个问题,如果在-dealloc与-viewDidUnload中对哪些属性的发布有区别,则详细说明这一区别。

    -viewDidUnload
    严格地用于发布带有retain属性的iboutlet

    原因是UIViewController保留了一个视图属性。该视图属性本身保留对其所有子视图的引用。这些子视图正是您在这些插座属性中保留的内容。问题在于这些子视图上有一个“额外”的保留

    -viewDidUnload
    的目标是清除不必要的内存使用。调用
    -viewDidUnload
    时,视图属性已被释放,它将释放顶级UIView及其所有子视图。但是,由于我们保留了其中的一些子视图,它们会留在内存中,我们希望释放它们,因为它们将不再被使用。当(如果)重新加载视图时,将创建这些子视图的新副本。属性也被设置为nil,严格来说,这样我们就没有指向释放内存的指针


    -dealloc
    中,应释放所有保留的属性和实例变量。如果刚刚执行了
    -viewDidUnload
    ,您将发送一个无害的
    [nil release]到您刚刚设置为nil的IBOutlet保留属性。

    尼克完美地回答了问题的第1部分,因此我立即跳到第2部分

    你是有保证的,真的!当视图从nib文件重新加载时,该nib文件上的所有内容都会重新加载。没有方法部分加载nib文件的内容,所以如果重新加载该nib,则其中的所有内容也将重新加载。但从nib加载的所有内容都有自动释放功能。所以你必须保留它们。如果您有保留这些新加载的类的插座,并且您将这些插座连接为nib上的插座,那么就可以开始了。在视图控制器示例中,控制器本身是该nib的文件所有者,视图是nib上的根元素,视图由文件所有者“视图”保留,所有其他子元素由视图本身保留。如果您有多个根元素或根视图没有保留的元素,那么您必须确保这些元素有保留它们的出口如果系统自动加载nib,如果您是通过方法加载nib,那么您必须知道所有这些类在到达您的代码时都会自动释放


    简单的视图也是类,当一个nib文件被加载时,它里面的所有东西都被加载,而不是其中的一部分。管理门店是您的责任。

    要添加优秀答案:


    有了Apple LLVM 3.0编译器(并且启用了ARC),对-dealloc的需求消失了(或者至少,需要在其中释放您的输出),只剩下-viewDidUnload来处理。因此,不再有重复的代码。

    因此,总而言之,您的答案是1。是“是的,复制你的插座的释放,是的,这是一种痛苦,接受它。”?我错过了你问题的一部分,你说你有从nib加载的非查看IB插座。我不是100%肯定,但我想说的是,你应该只在dealloc中发布,因为它们与视图无关。希望有人能澄清这一点。