具有NSString属性的Object的NSMutableArray会导致内存泄漏

时间:2010-04-22 09:42:19

标签: iphone memory-management

我希望将对象添加到NSMutableArray“myArray”,NSMutableArray是FileObj的数组,它具有NSString属性“fileName”

#import <UIKit/UIKit.h>


@interface FileObj :  NSObject  {

    NSString *fileName;


}


-(void) setfileName:(NSString *)s ;
-(NSString *) getfileName ;


@end

//
//  File.m//

#import "File.h"


@implementation FileObj
 -(void) setfileName:(NSString *)s ;
{
    fileName=s;
}
-(NSString *) getfileName ;
{
    return fileName;
}
@end

我在这里初始化myArray:

NSMutableArray *temarray;
temarray=[[NSMutableArray alloc] init];
self.myArray=temarray;
[temarray release];

将对象添加到myArray的代码

FileObj *newobj=[[FileObj alloc]init ];
NSString  *fieldValue2 = [[NSString alloc]   initWithUTF8String:@"aaaa"];
[newobj setfileName:fieldValue2];



[myArray addObject:newobj];

[fieldValue2 release]; //**if I enabled the line, it will cause crash**
                       //**if I disable the line, it will cause memory leak**


[newobj release];

欢迎任何评论

由于

InterDev中

3 个答案:

答案 0 :(得分:1)

首先,您应该了解ObjC命名约定。 ObjC中没有-get方法。使用您自己的2个字母(如NS)为您的课程添加前缀也是一个好主意。

您的setter值赋值无效,并且不需要NSString初始化。 我会强烈向您推荐介绍材料!

@interface MYFileObject : NSObject {

    NSString *_fileName;
}

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

@end

和实施

@implementation MYFileObject

- (void)setFileName:(NSString *)theString {
    [_fileName release];
    _fileName = [theString copy];
}

- (NSString *)fileName {
    return [[_fileName copy] autorelease];
}

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

@end

你会添加这样的对象......

NSMutableArray *myAry = [[NSMutableArray alloc] init];
MYFileObject *obj = [[MYFileObject alloc] init];
[obj setFileName:@"thefilename.txt"];

[myAry addObject:obj];
[obj release];

我建议使用属性而不是定义自己的getter / setter。 您还可以使用NSMutableArrays指定的初始化器来快速创建数组。

在此处查看如何使用属性:http://developer.apple.com/mac/library/documentation/cocoa/Conceptual/ObjectiveC/Articles/ocProperties.html

答案 1 :(得分:1)

为什么要打扰吸气者和制定者?已使用declared property

@interface FileObj :  NSObject  {
    NSString *fileName;
}
@property(retain,nonatomic) NSString* fileName;  // <---
@end

...

@implementation FileObj
@synthesize fileName;    /// <---
-(void)dealloc {
  [fileName release];    // Remember to release the object on dealloc.
  [super dealloc];
}
@end

...

FileObj *newobj=[[FileObj alloc] init];
NSString  *fieldValue2 = [[NSString alloc] initWithUTF8String:@"aaaa"];

newobj.fileName = fieldValue2;   /// <----

[myArray addObject:newobj];

[fieldValue2 release];
[newobj release];

答案 2 :(得分:0)

发生崩溃是因为NSString实例不再保留。

一种常见的模式是保留NSString属性,使用@property或手动声明。

您应该像这样修改设置器:

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