2011-12-13 62 views
1

我關於實施紙牌類的工作,我已經創建了下面的方法:如何管理內存自動釋放對象

+ (id)cardWithCard:(Card *)newCard 
{ 
Card *card = [[[Card alloc] initWithCard:newCard] autorelease]; 
return card; 
} 

我使用自動釋放方法,在這裏引起否則產品 - >分析警告我一下潛在的泄漏。一切工作正常,直到變量myCard(它被分配更早),像這樣分配一個新值:myCard = [Card cardWithCard:newCard]作爲參數發送到不同的方法。原來在那裏被釋放,我的應用程序崩潰。 我應該如何解決這個問題?獲取autorelease方法,儘管分析的警告?

回答

2

每個方法或對象都應該負責保留它感興趣的對象。
它更容易維護。 (例外的情況是有alloc,在那裏名newcopy方法,他們將調用者負責release返回一個對象。)

所以,你需要保持autorelease因爲該方法不後存在return,並且將無法在其上調用發佈。
要調用的對象cardWithCard應該是retain對象,如果它希望它更活的時間那個特定的方法。

代碼應該是這個樣子

self.myCard = [Card cardWithCard:newCard]; 

這在myCard是申報這樣

@property (nonatomic, retain) Card * myCard; 

因此,在這種情況下的情況下,酒店將做保留你和意志當你在這個屬性中放置一個新對象時釋放該對象。 (如果覆蓋了自動生成的訪問,您將需要管理的是自己的方法)

如果由於某種原因,你不想使用屬性......那麼這是你的選擇:-)
你需要做這樣的事情:

myCard = [[Card cardWithCard:newCard] retain]; 

,您需要在以後像這樣的

[myCard release]; 

如果它不是在同一個方法,分析儀將compline,如果它是在同樣的方法,你可能不會n去掉了retain

+0

非常感謝您的詳細解釋。我在實踐中得到的是:當我做這些@屬性(非原子,保留)卡* myCard;沒有改變。 myCard仍然在我傳遞給它的方法中釋放。這樣做 - myCard = [[Card cardWithCard:newCard] retain];已經解決了問題,應用程序不再崩潰,但現在我想知道如果我有泄漏(分析說,我不),因爲我保留我的卡在一個循環,但只發布一次。你怎麼看?我現在有泄漏嗎? –

+0

@AndreyChernukha不要這樣做!你正在繞過你的'@屬性'你需要做'self.myCard = something',所以屬性被調用並且做它的魔術。如果你做'myCard = something',你正在繞過你的@屬性,這就是爲什麼你需要額外的'retain'。如果你總是繞過財產不要麻煩宣佈他們,但這不是一個好的方式去,它更容易出錯 –

+0

再次謝謝你 –