2010-03-16 105 views
0

我在內存管理上有問題(目標C)。有兩種理想的情況。ObjC/iPhone中的內存管理

=============================情景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方法realase)。

在第二個場景中,我從其他Obj.m文件獲取myObj(分配),所以otherObj.m文件負責釋放分配的內存(意味着autorelease)?這樣對嗎?

請讓我知道根據蘋果內存指導原則,哪種方案更高效和有效。 請不要顯示任何文件鏈接。

感謝 馬努

+0

您可能想要單擊工具欄中帶有所有二進制數字的小圖標,它會將其格式設置爲代碼:)。 – 2010-03-16 05:51:59

回答

1

我建議the documentation對內存管理的iPhone?

+0

這裏getter方法給你一個分配的對象。就像alloc方法一樣...但是爲什麼我們應該把它發送到autorelease池。我們可以在調用gettter方法後解決這個問題。我是負責人得到的對象,所以我是這種方法的所有者...爲什麼蘋果是不允許在getter方法後釋放..它建議我們已將它保留在autorelease池becasue gettter方法是此對象的所有者.. 。這意味着autorelease池會增加..它會創建問題,如果我多次調用此方法? – Manoj 2010-03-16 06:21:20

2

第二種方法更可取。約定是隻有「alloc」和「copy」方法才能返回調用者釋放責任的對象。這個慣例是爲了便於維護,與效率無關。

如果您正在考慮在具有多次迭代的循環中調用getMyObject,效率(內存類型)才真正起作用。在這種情況下,自動發佈的MyObj對象將在內存中生成,因爲它們直到運行循環迭代結束才釋放。如果這是一個問題,請將alloc/init移到方法調用之外,以便您可以在循環的每次迭代結束時自行釋放該對象。

+0

如果從getter方法返回的每個對象都會去自動釋放池..比autoreleas池會增加,可能會造成內存不足?可能嗎? – Manoj 2010-03-16 06:36:51

+0

此外,以'get'開頭的名稱暗示您將要將其存儲在某個變量中,如'[obj getName:&someDestination]'。 – 2010-03-16 06:37:58

+0

@Manu:這是正確的。這就是爲什麼你可能想將'[[MyObj alloc] init]'從getMyObject'移出到'funcA'。然後,您可以像在「場景1」中那樣在'funcA'中釋放對象。 – Tom 2010-03-16 06:44:21