2010-04-25 4 views
1

NSMutableArray (fileArray)에 MYFileObj를 저장하고 UITavleView (tableview)에 데이터를 표시하려고합니다.NSMutableArray에서 객체를 제거 할 때 메모리 누수가 발생했습니다.

//----------------------------------MYFileObj 
#import <UIKit/UIKit.h> 


@interface MYFileObj : NSObject { 

    NSString *fileName; 

} 

-(void) setFileName:(NSString *)s ; 
-(NSString *) fileName ; 


@end 

내가 데이터

NSMutableArray *fileArray; 
를 저장할 배열

나는 새로운 객체를 생성하고, 내가 fileArray를 다시로드 할 무언가를 처음 relaodData 후 fileArray

MYFileObj *newobj=[[MYFileObj alloc] init ]; 
NSString *ss=[[NSString alloc] initWithFormat:@"%@",path] ; 
[newobj setFileName:ss]; 
[ss release]; 
[fileArray addObject:newobj]; 
[newobj release]; 

[atableview reloadData]; 

에 추가 할 그리고 atableview 다시 그리기.

//code to remove all object in atableview 
if([fileArray count]>0) 
{ 
    [fileArray removeAllObjects]; 
    [atableview reloadData]; 
} 

메모리 누수가 있음을 확인했습니다. "removeAllObjects"메서드가 MYFileObj 만 제거하거나 MYFileObj의 멤버 속성 인 "fileName"을 제거하는 방법을 알고 싶습니까?

감사

InterDev에서

+0

선언 된 속성을 사용하십시오. getter와 setter는 인터페이스에서'@property (copy, nonatomic) NSString * fileName; '과 구현시 자동으로'@synthesize fileName;'으로 생성 될 수 있습니다. – kennytm

답변

1

좋은 방법은 setter에서 retain/release를 사용하는 것입니다. 이렇게하면 불필요한 객체 생성/복사를 피할 수 있습니다.

- (void)setFileName:(NSString *)s { 
    [s retain]; // <- Retain new value 
    [fileName release]; // <- Release old value 
    fileName = s; 
} 

- (NSString *)fileName { 
    return fileName; 
} 

- (void)dealloc { 
    [fileName release]; // <- Release the instance 
    [super dealloc]; 
} 
+0

잘못된 설정자입니다. '[obj setFileName : [obj fileName]]'하면 앱이 다운됩니다. – kennytm

+0

세터를 수정했습니다 (희망). 고마워. –

0

당신이 당신의 MyFileObj 클래스 setFileNamedealloc을 구현하는 방법을 따라 달라집니다. release 메시지를 fileNamedealloc으로 보내십니까? 당신은 그것을 세터에 retain으로 보내십니까?

2

메모리 누수가있는 부분을 밝히지 않았지만 게시 된 코드에서 MyFileObj의 dealloc 메서드에서 fileName을 해제하지 않는다고 가정합니다.

관련 문제