Objc对象Dealloc内存管理

时间:2011-03-30 18:50:47

标签: iphone objective-c memory

如果我有一个名为Catalog的对象,它有一个名为“title”的(非原子的,保留的)attrib。我做“[attrib release];”在目录的dealloc方法中:

-(void)dealloc {
    [title release], title = nil;
    [super dealloc];
}

后来我做了“目录* c = [目录新];”。

比较 1:

dto.title = [[NSString alloc] initWithFormat:@“...”,...];

2:

dto.title = [NSString stringWithFormat:@“...”,...];

在dealloc方法中释放对象的所有属性是常识,但如果我传递一个访问器方法(已经有自动释放)怎么办?我应该在dealloc中释放或不释放accessor'd属性吗?

2 个答案:

答案 0 :(得分:4)

title的setter保留字符串,因此需要在-dealloc中释放它。你的第一个案例是错的......你正在调用+ alloc后跟+ stringWithFormat:。我怀疑你的意思是-initWithFormat:。此外,您需要在那里释放字符串,因为您正在分配它。在属性上调用-release是丑陋且不可靠的,因此在这种情况下使用临时变量是很常见的:

NSString *string = [[NSString alloc] initWithFormat:...];
dto.title = string;
[string release];

答案 1 :(得分:1)

如果访问者已经有自动释放,则不要在dealloc中再次释放它。新的+ copy + alloc计数必须与release + autorelease计数匹配。