我对内存管理(目标C)有疑问。有两种理想情况。
=============================方案1 ================ ========================
(void) funcA
{
MyObj *c = [otherObj getMyObject];
[c release];
}
-(MyObj *) getMyObject //(this method is available in other OtherObj.m file)
{
MyObj *temp = [[MyObj alloc] init];
// do smothing here
return temp;
}
=============================方案2 ================ ========================
(void) funcA
{
MyObj *c = [otherObj getMyObject];
}
-(MyObj *) getMyObject //(this method is available in other OtherObj.m file)
{
MyObj *temp = [[myObj alloc] init];
// do smothing here
return [temp autorelease];
}
myObj持有大量数据。
在第一个场景中,我从其他文件获取myObj(已分配),因此我必须使用自己的方法释放。 (根据任何C / C ++语言库,像strdup将返回字符串重复,稍后由开发人员重新使用,而不是通过strdup方法)。
在第二种情况下,我从otherObj.m文件获取myObj(已分配),因此otherObj.m文件负责释放分配的内存(平均自动释放)?是不是?
请根据Apple内存指南告诉我哪种方案更有效,更有效。 请不要给我看任何文件链接。
由于 马努
答案 0 :(得分:2)
第二种方法更可取。惯例是只有“alloc”和“copy”方法应该返回一个对象,该对象是调用者释放的责任。这个惯例是为了便于维护,与效率无关。
如果你考虑在循环中调用getMyObject
并进行多次迭代,效率(内存种类)才真正发挥作用。在这种情况下,自动释放的MyObj对象将在内存中累积,因为它们在运行循环迭代结束之前不会释放。如果这是一个问题,请将alloc / init移到方法调用之外,这样就可以在循环的每次迭代结束时自己释放对象。
答案 1 :(得分:1)
我可以为iPhone的内存管理建议the documentation吗?