2010-04-26 46 views
6

假設我有一個tableview類,它列出了100個Foo對象。它具有:多個對象在Objective-C/Cocoa中保留相同的對象可以嗎?

 
@property (nonatomic, retain) NSMutableArray* fooList; 

,我填滿它與FOOS像:

 
self.fooList = [NSMutableArray array]; 
while (something) { 
    Foo* foo = [[Foo alloc] init]; 
    [fooList addObject:foo]; 
    [foo release]; 
} 

第一個問題:因爲NSMutableArray中被標記爲保留,這意味着它裏面的所有的對象都保留嗎?我是否正確地添加foo並在將它添加到數組之後釋放本地副本?或者我錯過了保留電話?

然後,如果用戶選擇表中的一個特定的行,我想顯示一個細節美孚視圖我呼籲:現在

 
@property (nonatomic, retain) Foo* theFoo; 

這樣既:

 
FooView* localView = [[FooView alloc] initWithFoo:[self.fooList objectAtIndex:indexPath.row]]; 
[self.navigationController pushViewController:localView animated:YES]; 
[localView release]; 

現在FooView類有數組保持着那個Foo以及FooView。但那似乎沒問題吧?當用戶點擊後退按鈕時,將在FooView上調用dealloc,並調用[theFoo release]。然後點擊另一個後退按鈕,在tableview類上調用dealloc,並調用[fooList release]。

你可能會認爲,FooView類應該有:

 
@property (nonatomic, assign) Foo* theFoo; 

與保留。但是有時候FooView類會被一個不在數組中的Foo調用。所以我想確定兩個物體放在同一個物體上是可以的。

回答

4

正如其他人所說,你在做什麼是正確的,代碼看起來是正確的。我有幾十個對我的代碼中的同一個對象的引用,只要我平衡了所有的保留和釋放,一切正常。

添加更多細節...你問:

因爲NSMutableArray被標記爲保留,這意味着它裏面的所有對象也保留呢?

這些是兩個不同的東西。所有集合類(字典,數組,集合)都會自動保留添加到它們的內容,並在收集對象被釋放時釋放它們的內容對象。 (在NSMutableArray的情況下,如果您從數組中單獨刪除內容對象,或者當您釋放整個數組時,內容對象將被釋放。)

這與集合對象本身是保留還是分配爲無關屬性。唯一需要考慮的是,如果您對收集對象屬性的策略不正確,那麼它可能會比您想象的遲早或晚些時候發佈,並且可能會失去平衡。

正如其他人所說...讀了memory management guide,並練習。 :)哦,並從這個角度閱讀其他人的代碼,並試圖瞭解他們如何/爲什麼他們正在做他們的內存管理。

還有一件小事......對於每個保留屬性,請確保您在對象的dealloc方法中具有釋放調用。

+0

Typo:「...並在收集對象被釋放時釋放它們的內容對象。」 集合中的對象在釋放*之前不會被釋放。 – JeremyP 2010-04-27 08:57:39

+0

謝謝,修復。雖然你可以爭辯說,通過「發佈」,我的意思是「最後一個版本,保留數量爲零,這會觸發dealloc」:P,但只是說在這種情況下dealloc更清晰。 – Jaanus 2010-04-27 15:23:56

4

是的,沒關係。這就是引用計數內存管理系統的全部要點。

5

要回答你的主要問題,是的,你可以保留一個實例的多個對象。這正是參考計數內存管理的要點。看看可可Memory Management Programming Guide瞭解更多信息。然後重新閱讀它。它具有所有的答案,並將成爲你最好的朋友。

基本上,發送-retain消息表明發件人「擁有」的意義上,接收器不應該被釋放,直到所有業主們發佈了他們的所有權的接收器。因此,個別實例不需要知道(也不應該關心)其他所有者是否存在。保留你需要保留的任何東西,並在完成後釋放它。當全部業主已經釋放所有權時,可以釋放一筆資金。

在一個側面說明,

@property (retain,readwrite) NSMutableArray *myArray; 

聲明,聲明類此屬性將保留NSMutableArray實例。 NSArray,NSDictionaryNSSet(及其可變子類)始終保留其內容。

相關問題