NSDictionary作为属性

时间:2010-10-05 09:44:13

标签: iphone memory-leaks nsdictionary

通过使用以下代码

,我发现内存泄漏指向“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 个答案:

答案 0 :(得分:2)

您需要在重新分配之前释放_allData。您还需要在分配时保留它。

编辑:结合罗伯特的改进以摆脱不必要的NSDictionary。

EDIT2:因为您要跨API边界返回一个对象,所以需要将其重新调整为自动释放的对象。

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

    return [_allData autorelease];
}

您发布的代码有点奇怪,因为您正在创建一个名为allData的属性,告诉它使用_allData作为ivar(使用@synthesize),然后实现设置ivar的自定义getter。如果将该属性声明为readonly,则可以删除@synthesize语句。

如果您只在此方法中使用_allData而不是此类中的任何其他位置,则可以完全摆脱它。这是一个更简单的版本,可以做同样的事情:

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

答案 1 :(得分:0)

为什么不替换

NSDictionary *dw = [NSDictionary dictionaryWithContentsOfFile:path];


_allData = [NSDictionary dictionaryWithDictionary:dw];

使用

_allData = [NSDictionary dictionaryWithContentsOfFile:path];

然后你不必担心dw NSDictionary的自动释放,这可能会导致你的泄密。