iOS NSMutableArray Утечка памяти - PullRequest
0 голосов
/ 18 октября 2011

У меня небольшие проблемы с утечками памяти в моем объективном коде c.Кто-нибудь может взглянуть и сообщить мне, что они думают?

NSStringArray.h

@interface NSStringArray : NSObject {

NSMutableArray *realArray;

}

@property (nonatomic, assign) NSMutableArray *realArray;

-(id)init;
-(void)dealloc;
@end

NSStringArray.m

#import "NSStringArray.h"


@implementation NSStringArray

@synthesize realArray;

-(id)init {

self = [super init];
if ( self != nil ) {
    realArray = [[[NSMutableArray alloc] init] retain];
}
return self;
}

-(void)dealloc {
[realArray release];
realArray = nil;
[super dealloc];
}

Factory.m

+(NSStringArray *)getFields:(NSString *)line {
//Divides the lines into input fields using "," as the separator.
//Returns the separate fields from a given line.  Strips out quotes & carriage returns.

line = [line stringByReplacingOccurrencesOfString:@"\"" withString:@""];
line = [line stringByReplacingOccurrencesOfString:@"\r" withString:@""];

NSStringArray *fields = [[NSStringArray alloc] init];

for (NSString *field in [line componentsSeparatedByString:@","]) {
    [fields.realArray addObject:field];
    [field release];    
}

return [fields autorelease];
}

Инструмент Утечки говорит, что утечка происходит, когда поля выделены, и когда я добавляю строку поля в массив полей.

Кроме того, эта функция вызывается для каждой строки файла, который я анализирую.

Любые советы будут полезны.

Спасибо!

Ответы [ 5 ]

4 голосов
/ 18 октября 2011

Эта строка дважды удерживает:

realArray = [[[NSMutableArray alloc] init] retain];

достаточно

realArray = [[NSMutableArray alloc] init];
3 голосов
/ 18 октября 2011

В этом фрагменте кода вы нарушаете правила управления памятью.

for (NSString *field in [line componentsSeparatedByString:@","]) {
    [fields.realArray addObject:field];
    [field release];    
}

Вам не принадлежит объект, на который указывает field, поэтому вы не должны освобождать его.

Вы перевыпустили поле, поэтому последний объект, который его освободил (пул авто-релиза в вашем случае), освобождает уже освобожденный объект.

1 голос
/ 18 октября 2011

Вы также можете воспользоваться свойствами цели C, чтобы сделать ваш код более понятным и эффективным:

NSStringArray.h

@interface NSStringArray : NSObject {
}
@property (nonatomic, retain) NSMutableArray *realArray;
@end

NSStringArray.m

#import "NSStringArray.h"

@implementation NSStringArray

@synthesize realArray = _realArray;

-(id)init {

self = [super init];
if (self) {
    self.realArray = [NSMutableArray array];
}
return self;
}

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

Теперь, с модификатором retain свойства realArray, вы можете использовать [NSMutableArray array], который возвращает изменяемый массив с автоматическим высвобождением.

Свойства сохранения сами управляют содержимым сохранения / выпуска.

Вам не нужно использовать строку realArray = nil;.Вы уже освободили собственность.

Надеюсь, это поможет.

1 голос
/ 18 октября 2011

Добавление в ответ Felz выше. Используйте self.realArray при выделении массива

self.realArray = [[NSMutableArray alloc] init];

Поскольку вы создали свойство для массива, поэтому лучше использовать " self "

1 голос
/ 18 октября 2011

Из документов :

Сообщение выделения выполняет другие важные вещи, помимо выделения памяти:

  • Устанавливает счет сохранения объекта равным единице.(как описано в разделе «Как работает управление памятью»).

Поэтому вам не нужно сохранять то, что вы только что выделили.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...