释放在getter和setter中创建的对象

时间:2011-09-30 06:04:01

标签: iphone memory-management uiviewcontroller

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

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

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

感谢。

5 个答案:

答案 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)

它应该是释放。如果你想看到差异,那么在仪器中运行你的应用程序并检查它。