2011-04-13 2 views
0

현재 NSNulls로 전파 된 NSMutableArray를 만드는 NSMutableArray 범주가 있습니다. 나는 악기에서이 코드를 실행하면 그것은 내가 (여기서보고 코멘트를 읽기) 여기에 누수가 나에게 말한다배열이 NSNull로 채워진 배열을 반환하는 NSMutableArray 범주에 누설이 있음

#import "NSMutableArray+NSNull.h" 


@implementation NSMutableArray (NSNull) 

-(id)initWithNullCapacity:(int)capacity{ 

    self = [super init]; 
    if (self) { 
     //Leak on [self init] 
     NSMutableArray *array = [self init]; 

     for (unsigned i = 0; i < capacity; i++) 
     { 
      [array addObject:[NSNull null]]; 
     } 
     self = array; 
    } 
    return self; 
} 

편집 :

#import "TWVStatData.h" 
#import "NSMutableArray+NSNull.h" 

@implementation TWVStatData 

@synthesize creationTime; 
@synthesize graphs; 
@synthesize elements; 
@synthesize type; 

-(id)init{ 
    if(self == [super init]){ 
     type = -1; 

     creationTime = [[NSDate alloc] init]; 

     graphs = [[NSMutableArray alloc] initWithNullCapacity:3]; 
     elements =[[NSMutableArray alloc] init]; 
    } 
    return self; 
} 
: 나는 메소드를 호출 할 경우

이것은

답변

2

작업을 수행해야합니다 [슈퍼 초기화]가 수행 whetever있는 NSArray 아닌 NSMutableArray의 이니셜을 호출합니다 나는 중요한 일을 할 때를 대비하여 전화 할 것입니다.

앞서 언급했듯이 self =를 [self release]를 먼저 호출하지 않고 설정하면 호출 스택에서 한 수준 위로 alloc 호출에서 반환 된 이전 객체가 누출됩니다.

이것은 당신이해야 할 일이다

-(id)initWithNullCapacity:(int)capacity 
{ 
    self = [self initWithCapacity:capacity]; 
    if (self) 
    { 
     for (int i = 0; i < [self count]; i++) 
     { 
      [self addObject:[NSNull null]]; 
     } 
    } 
    return self; 
}  
+0

내가 제안한 것을 할 때, 계기는 나가 self = [self initWithCapacity : capacity]에 누출이다는 것을 나에게 말한다; – Cyprian

+0

@Cyprian이이 방법을 사용하는 코드를 게시 할 수 있습니까? 거기에 아무 문제가 있어서는 안됩니다 ... –

+0

그것을 사용하는 코드는 내 질문에 편집 아래에 게시됩니다 – Cyprian

2

네, 그것은 때문에 첫 번째 줄에

self = [super init]; 

당신이됩니다 C 하나의 객체 Reating (self)이고 self = array;self을 참조 해제하고 다시 지정합니다. 그래서 초기 값은 누설에 있습니다.

+0

감사합니다.하지만 메소드에서 변경해야 할 내용을 명시 적으로 말해 줄 수 있습니까? – Cyprian

1
-(id)initWithNullCapacity:(int)capacity 
{ 
    self = [super init]; 
    if (self) { 
     for (unsigned i = 0; i < capacity; i++) 
     { 
      [self addObject:[NSNull null]]; 
     } 
    } 
    return self; 
} 

당신은있는 NSMutableArray의 하위 클래스를 생성 단지 때문에 호출, 카테고리를 추가하지 않는

+0

글쎄 컴파일러가 나에게 오류가 발생했을 때 : - [NSMutableArray count] : 초기화되지 않은 가변 배열 객체로 메소드가 전송되었습니다. – Cyprian

+0

hmmmz, 시도했지만 오류가 발생하지 않았습니다. – mbehan

3

이 주로 인해 얼마나 NSArray 작품 아래로, 까다로운 일이 될 것입니다. 나는이 일을 추천 할 것입니다 :

- (id)initWithNullCapacity:(NSUInteger)capacity { 
    NSMutableArray *nulls = [NSMutableArray array]; 
    for (NSUInteger i = 0; i < capacity; i++) { 
    [nulls addObject:[NSNull null]]; 
    } 
    return [self initWithArray:nulls]; 
} 

내가 그 모르겠어요하지만 문제는, self에 할당에 따른 생각합니다. NSArray은 후드 아래에서 몇 가지 펑키 최적화를 수행하므로 초기화 도구를 까지 호출하지 말고 후에 모든 데이터를 준비합니다.

+0

인스 트루먼 트에서 코드를 실행할 때 줄 반환시 [self initWithArray : nulls]; 시행 착오 끝에 나는 대답으로 게시 한 구현으로 문제를 해결했다. – Cyprian

+0

@Cyprian 그러면 내가 잘못한 일을하고 있습니다. 왜냐하면 내가 이것을 분리 된 방식으로 사용할 때 누출없이 완벽하게 작동하기 때문입니다. –

+0

+1 좋아 보인다,하지만 가격이 실제로는 의미가 될 것 같지 않은데 잠시 동안 대신에 메모리에 2 개의 배열을 들고 있다고 가정합니다. –

관련 문제