2010-06-25 5 views
0

"Instruments"누출 분석기를 사용하여 게시 전에 앱을 정리하기 시작했습니다.배열의 객체에 대한 메모리 누수

내가 꽂을 수없는 누출을 발견했습니다. 그래서 문제를 설명하기위한 간단한 프로젝트를 만들었습니다. 아래 코드를 참조하십시오. 보기에 "테스트"절차를 테스트하기 위해 단추를 놓았습니다. 항상 누수가 발생합니다.

#import <Foundation/Foundation.h> 


@interface theObj : NSObject { 

는 NSString * theWord "theObj"라는 개체의 헤더 코드

첫째; } @property (비 원자력, 보유) NSString * theWord;

@end 

#import "theObj.h" 


@implementation theObj 
@synthesize theWord; 

-(id) initWithObjects: (NSString *) aWord; 
{ 
if (self = [super init]){ 
    self.theWord = aWord; 
} 
return self; 
} 

-(void) dealloc{ 
[theWord release]; 
[super dealloc]; 
} 

@end 

이제 뷰 컨트롤러

#import <UIKit/UIKit.h> 
#import "theObj.h" 

@interface LeakAnObjectViewController : UIViewController { 
NSMutableArray* arrObjects; 
} 
    - (IBAction)test; 
@end 

#import "LeakAnObjectViewController.h" 

@implementation LeakAnObjectViewController 

- (IBAction)test { 
if (arrObjects == nil) 
    arrObjects = [[NSMutableArray alloc] init]; 

NSString* aStr = @"first"; 
[arrObjects addObject:[[theObj alloc] initWithObjects:aStr]]; 
[arrObjects removeAllObjects]; 
} 
+1

Objective-C? 아마도 언어에 태그를 지정해야합니다 (그렇지만 내가 맞을지는 확실하지 않습니다). –

+0

질문을 할 때 더 많은 태그를 사용해야하며, 이는 작업중인 다른 기술에 알려주고 답변을 얻을 수있는 기회를 향상시킵니다. – VoodooChild

답변

0

당신은 당신이 그것을 자신의 의미 객체를 ALLOC. 그런 다음 배열에 배열을 지정하면 어레이가 배열을 소유한다는 의미입니다. 그런 다음 배열은 그것을 제거하므로 유일한 소유자입니다. 그러나 더 이상 객체에 대한 참조가 없으므로 릴리스 할 수 없으므로 방금 누출되었습니다.

+0

그래서 문제가되는 문자열을 릴리스하기 위해 코드를 변경했지만 여전히 누수가 발생합니다. - (IBAction) 테스트 { if (arrObjects == nil) arrObjects = [[NSMutableArray alloc] init]; NSString * aStr = @ "최초"; [arrObjects addObject : [[theObj alloc] initWithObjects : aStr]]; [arrObjects removeAllObjects]; [aStr release]; – user266429

+0

@manateeman : 음, 방금'aStr'에 대한 릴리즈를 추가했습니다. 당신의'[theObj alloc]'은 아직도 릴리스와 균형을 이루지 못합니다. 당신은'id temp = [[theObj alloc] initWithObjects : aStr]; 할 필요가있다. [arrObjects addObject : temp]; [임시 릴리스]; – Chuck

+0

OK Chuck - 많은 감사합니다. 테스트 프로젝트의 누수가 해결되었습니다. 나는 숲이 그 길을 가고 있다는 것을 제외하고는 나무를 보지 못했다는 핑계를 정말로 가지고 있지 않습니다. 이제 실제 세상으로 돌아가서 내 앱에 좋은 일을 할 수 있는지 알아 보겠습니다. – user266429

0

누군가가 실제로 the rules around memory management을 알아야합니다. 특히 소유권과 관련이 있습니다.

+0

제발 저를 믿으십시오 - 나는 과거의 만남은 말할 것도없이 오늘은 혼자서 3 번 읽었습니다. 바닥을 추가하면 그 줄을 추가하면됩니다. [aStr release]; 효과가 없습니다. 여전히 누출됩니다. – user266429

+0

적절한 경우 autorelease를 사용하고 적절한 위치에 유지해야합니다. 자동 복구를 사용하지 않고 alloc/init을 사용하는 경우 릴리스 이후에 참조가 있는지 확인해야합니다 너 자신. 이러한 방식으로 작업 할 때 해당 객체의 완전한 소유권을가집니다. 물건을 소장품에 넣는다면 이런 식으로해서는 안됩니다. 이것은 내가 링크 된 규칙에 모두 설명되어 있습니다. – jer