NSMutableArray for Object, имеющий свойство NSString, вызывает утечку памяти - PullRequest
1 голос
/ 22 апреля 2010

Я надеюсь добавить объекты в 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 ]

1 голос
/ 22 апреля 2010

Сначала вы должны изучить соглашения об именах 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

1 голос
/ 22 апреля 2010

Зачем беспокоиться о геттерах и сеттерах? Используйте объявленное свойство уже!

@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 голосов
/ 22 апреля 2010

Сбой происходит из-за того, что экземпляр NSString больше не сохраняется.

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

Вы должны изменить сеттер следующим образом:

-(void) setfileName:(NSString *)s ;
{
    [s retain]; // <- Retain new value
    [filename release]; // <- Release old value
    fileName=s;
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...