2010-04-22 58 views
1

希望將對象添加到一個的NSMutableArray「myArray的」所述的的NSMutableArray是陣列FileObj文件,其具有的NSString屬性「文件名」的NSMutableArray對於具有的NSString屬性對象導致內存泄漏

#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中

+0

請再試, 的NSString * fieldValue2 = [[[NSString的頁頭] initWithUTF8String:rowData]自動釋放]; – Tirth 2010-04-22 09:53:10

回答

1

首先,你應該看看ObjC命名約定。 ObjC中沒有-get方法。用你自己的2個字母(如NS)加上前綴也是一個好主意。

您的設置值分配無效,並且不需要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

0

的崩潰是因爲NSString的實例不再保留。

一種常見模式是保留NSString屬性,或者用@property或手工聲明。

您應該修改setter方法是這樣的:

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

爲什麼用getter和setter煩惱呢?已經使用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]; 
+0

這也適用於我。但我選擇eaigner作爲答案,因爲我不需要更改更多的源代碼。非常感謝。 – arachide 2010-04-22 11:53:53