ObjC / iPhone中的内存管理

时间:2010-03-16 05:44:27

标签: iphone

我对内存管理(目标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内存指南告诉我哪种方案更有效,更有效。 请不要给我看任何文件链接。

由于 马努

2 个答案:

答案 0 :(得分:2)

第二种方法更可取。惯例是只有“alloc”和“copy”方法应该返回一个对象,该对象是调用者释放的责任。这个惯例是为了便于维护,与效率无关。

如果你考虑在循环中调用getMyObject并进行多次迭代,效率(内存种类)才真正发挥作用。在这种情况下,自动释放的MyObj对象将在内存中累积,因为它们在运行循环迭代结束之前不会释放。如果这是一个问题,请将alloc / init移到方法调用之外,这样就可以在循环的每次迭代结束时自己释放对象。

答案 1 :(得分:1)

我可以为iPhone的内存管理建议the documentation吗?