2010-04-22 2 views
1

Я надеюсь добавить объекты к NSMutableArray «туАггау», The NSMutableArray является массивом для FileObj который имеет NSString свойства «FileName»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]; 

коды, чтобы добавить объект туАггау

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 Alloc] initWithUTF8String: ROWDATA] autorelease]; – Tirth

ответ

1

Во-первых, вы должны смотреть в соглашения об именовании ObjC. В ObjC нет методов -get. Также рекомендуется прикрепить свои классы к вашим собственным двум буквам (например, 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]; 

Я рекомендовал бы использовать свойство вместо определения собственных добытчиков/сеттеров. Вы также можете использовать инициализаторы NSMutableArrays для быстрого создания массива.

Посмотрите здесь, как использовать свойства: http://developer.apple.com/mac/library/documentation/cocoa/Conceptual/ObjectiveC/Articles/ocProperties.html

0

Катастрофа происходит потому, что экземпляр NSString не сохраняется больше.

Общим шаблоном является сохранение свойств NSString либо декларативно с помощью @property, либо вручную.

Вы должны изменить сеттер, как это:

-(void) setfileName:(NSString *)s ; 
{ 
    [s retain]; // <- Retain new value 
    [filename release]; // <- Release old value 
    fileName=s; 
} 
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]; 
+0

Это также работает для меня. Но я выбрал eaigner как Answer, потому что мне не нужно менять больше исходных кодов. Большое спасибо. – arachide

Смежные вопросы