当我从Aaron Hillegass的Cocoa Programming for Mac OSX第8章运行这个程序时遇到错误。 该程序将tableview绑定到数组控制器。在数组控制器的setEmployees方法中,
-(void)setEmployees:(NSMutableArray *)a
{
if(a==employees)
return;
[a retain];//must add
[employees release]; //must add
employees=a;
}
在书中,没有包含两个retain和release语句,每当我尝试添加新员工时,我的程序都会崩溃。谷歌搜索后,我发现这两个必须添加语句,以防止程序崩溃。
我不明白这里的内存管理。我正在为a
分配employees
。如果我没有取消分配任何内容,为什么我必须保留a
?为什么我可以在最后一个赋值语句中使用它之前释放employees
?
答案 0 :(得分:2)
这是使用手动参考计数(MRC)的设定者的标准模式。一步一步,这就是它的作用:
-(void)setEmployees:(NSMutableArray *)a
{
if(a==employees)
return; // The incoming value is the same as the current value, no need to do anything.
[a retain]; // Retain the incoming value since we are taking ownership of it
[employees release]; // Release the current value since we no longer want ownership of it
employees=a; // Set the pointer to the incoming value
}
在自动参考计数(ARC)下,访问者可以简化为:
-(void)setEmployees:(NSMutableArray *)a
{
if(a==employees)
return; // The incoming value is the same as the current value, no need to do anything.
employees=a; // Set the pointer to the incoming value
}
保留/释放是为您完成的。您还没有说过您遇到了什么样的崩溃,但似乎您在MRC项目中使用ARC示例代码。