静态分析仪说我有潜在的物体泄漏

Ste*_*eve 1 iphone xcode static-analysis memory-management objective-c

这是我制作一些闪存卡的对象.第一种方法(我省略了主要部分)使用传入的运算符生成一个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
Run Code Online (Sandbox Code Playgroud)

ken*_*ytm 6

是的,你正在泄漏一个物体.你应该

return [selectedCard autorelease];
Run Code Online (Sandbox Code Playgroud)

其原因是你-retain编的selectedCard,所以你有责任-release吧.但是您无法使用,-release因为它必须在函数结束后有效,因此您需要使用-autorelease将所有权转移到自动释放池.

当然,调用方法-drawFromDeck不应该是-release它的返回值.

  • @Joshua Weinberg - 但是,如果他这样做,它可能会在当前-removeObjectAtIndex:被调用时被解除分配.通过使用自动释放,至少它将存在足够长的时间以从该方法返回. (3认同)