代码之家  ›  专栏  ›  技术社区  ›  arachide

删除nsmutableArray中的对象时发生内存泄漏

  •  1
  • arachide  · 技术社区  · 15 年前

    我希望将myfileobj存储到nsmutableray(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];
    

    在第一次重新发布数据并做一些事情之后,我想重新加载filearray并重新绘制atableView。

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

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

    谢谢

    交互开发

    3 回复  |  直到 15 年前
        1
  •  1
  •   Laurent Etiemble    15 年前

    一个好的做法是在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
  •  2
  •   Claus Broch    15 年前

    您没有说明检测到内存泄漏的位置,但我从发布的代码中假定您没有在myfileobj的dealloc方法中释放文件名。

        3
  •  0
  •   matei    15 年前

    这取决于您如何实现 setFileName dealloc 在你 MyFileObj 班级。你发送一个 release 消息到 fileName 在里面 释放内存 ?你寄一份吗 retain 在你的二传手?