1

이것은 플래시 카드를 만들기 위해 만든 객체입니다. 첫 번째 방법 (나는 주요 부분을 생략했다)은 전달 된 연산자로 Card 객체의 NSMutabaleArray를 생성하고 올바르게 작동합니다. 두 번째 메서드 인 "drawFromDeck"은 뷰 컨트롤러의 Deck 객체에서 호출되며 제대로 작동하지만 Static Analyzer에서는 객체가 누출 될 수 있다고 말합니다.정적 분석기가 객체의 누출 가능성이 있다고 말합니다.

다음은 코드입니다.

#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]; 

이유는 -release에 책임을 가지고 있도록 -retain에서, selectedCard 에드 한 것. 그러나 -release은 함수가 끝난 후 유효해야하므로 사용할 수 없으므로 -autorelease을 사용하여 소유권을 자동 릴리스 풀로 전송해야합니다.

물론 -drawFromDeck을 호출하는 메서드는 반환 값이 -release이 아니어야합니다.

+0

나는 처음부터 카드를 보관하지 않는 것이 더 명확 할 것이라고 말하고 싶습니다. 그는 그 시점에서 소유권을 가질 이유가 없습니다. 카드 * selectedCard = [카드 objectAtIndex : 색인]; –

+3

@Joshua Weinberg - 그러나 그가 그렇게했다면 즉시 제거 될 수 있습니다. -removeObjectAtIndex :가 호출되었습니다. autorelease를 사용하면 최소한 메서드에서 반환 할 수있을만큼 오래 존재합니다. –

+0

내 가정을 테스트, 내가 틀렸다. 생각하기에 이제는 생각합니다. –

관련 문제