在NSMutableArray中删除对象时发生内存泄漏

时间:2010-04-25 11:02:08

标签: iphone objective-c memory-leaks

我希望将MYFileObj存储到NSMutableArray(fileArray)并在UITavleView(tableview)上显示数据。

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


@interface MYFileObj :  NSObject  {

    NSString *fileName;

}

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


@end

我要存储数据的数组

NSMutableArray *fileArray;

我创建了新对象并添加到fileArray

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

[atableview reloadData];

第一次使用relaodData并执行某些操作后,我想重新加载fileArray并重新绘制atableview。

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

我注意到有内存泄漏。 我希望知道方法“removeAllObjects”只删除MYFileObj本身,还是删除MYFileObj的成员属性“fileName”?

由于

InterDev中

3 个答案:

答案 0 :(得分:2)

您没有说明您检测到内存泄漏的位置,但我会从发布的代码中假设您没有在MyFileObj的dealloc方法中释放fileName。

答案 1 :(得分: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];
}

答案 2 :(得分:0)

这取决于您在setFileName课程中实施deallocMyFileObj的方式。您是否在releasefileName发送了dealloc条消息?你在你的二传手中发送了retain吗?