2010-07-02 25 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

相关问题