通过使用以下代码
,我发现内存泄漏指向“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中的数据正在发生变化,当我要求通过属性检索新的内容时,它会泄漏。 任何建议如何明确?或者如何在没有泄漏的情况下实现这种事情?
由于
答案 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的自动释放,这可能会导致你的泄密。