NSDictionary как свойство - PullRequest
       14

NSDictionary как свойство

0 голосов
/ 05 октября 2010

Я получаю утечки памяти, указывающие на строку "NSDictionary *dw = [NSDictionary dictionaryWithContentsOfFile:path];", используя следующий код

NSDictionary    *_allData;

@property (nonatomic, retain) NSDictionary  *allData;

@synthesize allData = _allData;

+ (NSString*)getNSPath

{
 NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);

 NSString *documentsDirectory = [paths objectAtIndex:0];

 NSString *path = [documentsDirectory stringByAppendingPathComponent:@"alarm.plist"];

 return path;
}


- (NSDictionary *)allData
{
 NSString *path = [saveAlarm getNSPath];
 NSDictionary *dw = [NSDictionary dictionaryWithContentsOfFile:path];


 _allData = [NSDictionary dictionaryWithDictionary:dw];

    return _allData;
}

Данные меняются в списке pList, и когда я спрашиваю, что нового там есть по свойствуэто протекает.Любая рекомендация, как сделать это ясно?Или как реализовать такую ​​вещь без утечек?

Спасибо

Ответы [ 2 ]

2 голосов
/ 05 октября 2010

Вам необходимо освободить _allData перед переназначением.Вам также нужно сохранить его при назначении.

РЕДАКТИРОВАТЬ: Включение улучшения Роберта, чтобы избавиться от ненужного NSDictionary.

EDIT2: Поскольку вы возвращаете объект через границу API, его необходимо перенастроить как автоматически выпущенный объект.

- (NSDictionary *)allData
{
     NSString *path = [saveAlarm getNSPath];
     [_allData release];
     _allData = [[NSDictionary dictionaryWithContentsOfFile:path] retain];

    return [_allData autorelease];
}

Код, который вы опубликовали, немного странен, поскольку вы создаете свойство allData,сказав ему использовать _allData в качестве ивара (с @synthesize), а затем внедрив пользовательский метод получения, который устанавливает ивар.Если вы объявите свойство только для чтения, вы можете удалить оператор @synthesize.

Если вы используете _allData только внутри этого метода, а не где-либо еще в этом классе, вы можете полностью избавиться от него.Вот гораздо более простая версия, которая делает то же самое:

- (NSDictionary *)allData
{
     NSString *path = [saveAlarm getNSPath];
     return [NSDictionary dictionaryWithContentsOfFile:path];
}
0 голосов
/ 05 октября 2010

Почему бы вам не заменить

NSDictionary *dw = [NSDictionary dictionaryWithContentsOfFile:path];


_allData = [NSDictionary dictionaryWithDictionary:dw];

С

_allData = [NSDictionary dictionaryWithContentsOfFile:path];

Тогда вам не нужно беспокоиться об автоматическом выпуске dw NSDictionary, который, вероятно, вызывает вашу утечку.

...