如果我有一个名为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属性吗?
答案 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计数匹配。