2010-07-02 24 views
1

這是我製作閃存卡的一個物體。第一種方法(我遺漏了主要部分)使用傳入的運算符生成一個Card對象的NSMutabaleArray,並且正常工作。第二種方法,「drawFromDeck」從我的視圖控制器被調用一個Deck對象,也工作正常,但靜態分析器說我可能正在泄漏一個對象。靜態分析儀說我有可能泄漏一個物體

這是代碼。

#import "Deck.h" 

@class Deck; 
@implementation Deck 

@synthesize cards; 

- (id)initDeckWithOperator: (NSString*)mathOper { 

... 

return self; 
} 

- (id)drawFromDeck { 
    int index = random() % [cards count]; 
    Card* selectedCard = [[cards objectAtIndex:index] retain]; 
    [cards removeObjectAtIndex:index]; 
    return selectedCard; 
} 

@end 

回答

6

是你泄露的對象。你應該

return [selectedCard autorelease]; 

的原因是你已經-retain愛德selectedCard,所以你有責任-release它。但是您不能使用-release,因爲它在函數結束後必須有效,所以您需要使用-autorelease將所有權轉移到自動發佈池。

當然,調用-drawFromDeck的方法不應該是-release它的返回值。

+0

我會說,這將是更清楚的只是不保留卡在第一位。他沒有理由在這一點上擁有所有權。 Card * selectedCard = [cards objectAtIndex:index]; – 2010-07-02 15:59:55

+3

@Joshua Weinberg - 但是,如果他這麼做了,它可能會在即時被釋放--removeObjectAtIndex:被調用。通過使用autorelease,至少它會存在足夠長的時間從該方法返回。 – 2010-07-02 17:38:51

+0

測試了我的假設,我錯了。現在我想到了它是有道理的。 – 2010-07-03 03:45:47

相關問題