【问题标题】: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;
}