【问题标题】:releasing object created in getter and setter释放在 getter 和 setter 中创建的对象
【发布时间】:2011-11-28 05:18:52
【问题描述】:

我对保留在 .h 文件中有一些疑问。我知道如果我们分配/复制/保留比我们需要释放它,但在以下情况下

@property (nonatomic, retain) IBOutlet UITableView *myTable;

我是否需要在我的 dealloc 中释放这个表视图对象。我使用 xib 创建了这个 tableview。

谢谢。

【问题讨论】:

    标签: iphone memory-management uiviewcontroller


    【解决方案1】:

    是的,您必须这样做,因为您将在 .h 文件中创建一个对象并为其分配内存。您在 XIB 中所做的唯一事情就是在两者之间创建链接(XIB 只是作为inner tableview) ,但是如果您使用 xib 发布了一个按钮并且没有通过代码链接它,那么您不必释放它...

    【讨论】:

      【解决方案2】:

      不,你不需要 你只需要释放你分配的对象。 因为表格视图是在 xib 中分配的,所以你应该不关心它的发布 希望这会有所帮助

      【讨论】:

        【解决方案3】:

        首先,您没有在 .h 文件中保留任何内容。

        .h 文件中的@property 声明(也可以在.m 文件中)的目的是告诉编译器在您使用时如何处理该属性的getter 和setter(点语法)。

        例子:

        通过以下方式声明属性:

        @property (nonatomic, retain) IBOutlet UITableView *myTable;
        

        告诉编译器当您在 .m 文件中创建 UITableView 时,如下所示:

        - (id)initWithTable:(UITableView *)table
        {
            self = [super init];
            if (self) {
        
                self.myTable = table;
            }
            return self;
        }
        

        编译器会自动知道要保留它,因此您还需要释放它。

        但是,如果您以以下方式声明您的财产:

        @property (nonatomic, assign) IBOutlet UITableView *myTable;
        

        并像前面的例子一样创建了 tableView

        - (id)initWithTable:(UITableView *)table
        {
            self = [super init];
            if (self) {
        
                self.myTable = table;
            }
            return self;
        }
        

        编译器只会将 myTable 的值赋值为指向表。你不会拥有它,也不应该释放它。

        【讨论】:

          【解决方案4】:

          它应该是释放。如果您想查看差异,请在仪器中运行您的应用程序并进行检查。

          【讨论】:

            【解决方案5】:

            这么说the docs:

            nib 文件中的对象创建时保留计数为 1,然后 自动发布。然而,当它重建对象层次结构时,UIKit 使用 setValue:forKey: 方法,它使用可用的 setter 方法或 如果没有可用的 setter 方法,则默认保留对象。如果你 为 nib 文件对象定义出口,你应该总是定义一个 setter 访问该插座的方法(或声明的属性)。二传手 outlet 的方法应该保留它们的值,而 setter 方法应该保留它们的值 包含顶级对象的 outlet 必须保留其值以 防止它们被释放。

            And:

            当出现内存不足警告时,UIViewController 类会清除 如果它知道它可以稍后重新加载或重新创建它们,它的视图。如果 发生这种情况,它还会调用 viewDidUnload 方法来提供您的代码 放弃任何相关对象的所有权的机会 使用您的视图层次结构,包括使用 nib 文件加载的对象, 在 viewDidLoad 方法中创建的对象,以及延迟创建的对象 在运行时并添加到视图层次结构中。通常,如果您的视图 控制器包含出口(属性或原始变量包含 IBOutlet 关键字),您应该使用 viewDidUnload 方法 放弃这些网点或任何其他与视图相关的数据的所有权 你不再需要了。

            所以基本上,当从 NIB/XIB 加载时,会使用该属性。这意味着,如果您在 IBOutlets 上指定保留属性(您应该这样做),则需要释放它们。执行此操作的首选方法是在viewDidUnload 中使用该属性。

            @property (nonatomic, retain) IBOutlet UITableView *myTable;
            
            ...
            
            - (void) viewDidUnload
            {
                self.myTable = nil;
            }
            

            【讨论】:

              猜你喜欢
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 2017-11-14
              • 1970-01-01
              • 1970-01-01
              • 2014-08-05
              相关资源
              最近更新 更多