我对.h文件中的保留有一些疑问。我知道如果我们分配/复制/保留比我们需要释放它,但在以下情况
@property (nonatomic, retain) IBOutlet UITableView *myTable;
我是否需要在dealloc中释放此表视图对象。我使用xib创建了这个tableview。
感谢。
答案 0 :(得分:1)
是的,您必须像在.h文件中创建对象并分配内存一样。您在XIB中唯一要做的就是在两者之间创建一个链接(XIB只是作为内部tableview),但如果您使用xib发布了一个按钮并且没有通过代码链接它,那么您不必释放它...
答案 1 :(得分:1)
首先,你没有在.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的值指向表。你不会拥有它,也不应该释放它。
答案 2 :(得分:1)
所以说the docs:
创建nib文件中的对象,保留计数为1,然后创建 自动释放。但是,在重建对象层次结构时,UIKit 使用。重新建立对象之间的连接 setValue:forKey:方法,它使用可用的setter方法或 如果没有可用的setter方法,则默认保留该对象。如果你 定义nib文件对象的出口,你应该总是定义一个setter 用于访问该插座的方法(或声明的属性)。二传手 出口的方法应该保留它们的值,并设置方法 包含顶级对象的出口必须保留其值 防止它们被解除分配。
And:
发生内存不足警告时,UIViewController类将清除 它的视图是否知道它可以在以后重新加载或重新创建它们。如果 发生这种情况时,它还会调用viewDidUnload方法来提供代码 有机会放弃任何相关对象的所有权 与您的视图层次结构,包括使用nib文件加载的对象, 在viewDidLoad方法中创建的对象,以及懒惰创建的对象 在运行时并添加到视图层次结构中。通常,如果您的观点 controller包含outlet(属性或包含的原始变量) 在IBOutlet关键字中,您应该使用viewDidUnload方法 放弃对这些网点的所有权或任何其他与视图相关的数据 那你不再需要了。
所以基本上,当从NIB / XIB加载时,使用该属性。这意味着,如果您在IBOutlets上指定了保留属性(您应该这样做),则需要释放它们。执行此操作的首选方法是viewDidUnload
,使用属性。
@property (nonatomic, retain) IBOutlet UITableView *myTable;
...
- (void) viewDidUnload
{
self.myTable = nil;
}
答案 3 :(得分:0)
不,你不需要 你只需要释放你已分配的对象。 因为表视图是在xib中分配的,所以它的发布应该不是你关心的问题 希望这有帮助
答案 4 :(得分:0)
它应该是释放。如果你想看到差异,那么在仪器中运行你的应用程序并检查它。