Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/objective-c/22.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Iphone 客观C记忆问题_Iphone_Objective C_Memory Management_Crash_Nsdictionary - Fatal编程技术网

Iphone 客观C记忆问题

Iphone 客观C记忆问题,iphone,objective-c,memory-management,crash,nsdictionary,Iphone,Objective C,Memory Management,Crash,Nsdictionary,我的应用程序内存管理有问题。我有一个NSDictionary实例变量,我正在将其设置为在方法中生成的另一个NSDictionary。这一切都很好,我的应用程序的行为就像我希望的那样,但我在应用正确的内存管理时遇到了问题 如果我释放本地字典,它最终会在重复调用该方法时导致崩溃,因为保存在实例变量中的数据也会被破坏。代码如下: NSBundle *bundle = [NSBundle mainBundle]; NSString *plistPath = [bundle pathForResource

我的应用程序内存管理有问题。我有一个NSDictionary实例变量,我正在将其设置为在方法中生成的另一个NSDictionary。这一切都很好,我的应用程序的行为就像我希望的那样,但我在应用正确的内存管理时遇到了问题

如果我释放本地字典,它最终会在重复调用该方法时导致崩溃,因为保存在实例变量中的数据也会被破坏。代码如下:

NSBundle *bundle = [NSBundle mainBundle];
NSString *plistPath = [bundle pathForResource:@"Names" ofType:@"plist"];

NSDictionary *dictionary = [[NSDictionary alloc] initWithContentsOfFile:plistPath];
self.dictAllValues = dictionary;
[dictionary release];

作为基本规则的推论,如果需要将接收到的对象作为属性存储在实例变量中,则必须保留或复制它

因此,在本例中,放入
[dictionary release]dealloc
方法中的code>in(或您可能用于清理的任何其他方法)应该可以正常工作


我假设您的
dictAllValues
属性使用简单赋值,如果不是这样,请告诉我。

如何声明
dictAllValues
?通常是:

 @property(retain) NSDictionary *dictAllValues;

如果是这样,那么代码中的
版本
是正确的,您的问题在别处。发布崩溃的回溯,使用构建、分析和修复任何问题,并尝试启用僵尸检测。

使用

 @property(retain) NSDictionary *dictAllValues;
你的方法

-(void) myMethod
{
NSBundle *bundle = [NSBundle mainBundle];
NSString *plistPath = [bundle pathForResource:@"Names" ofType:@"plist"];

NSDictionary *dictionary = [[NSDictionary alloc] initWithContentsOfFile:plistPath];
self.dictAllValues = dictionary;
[dictionary release];
}
并以dealoc方法释放

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

感谢您的快速回复,这解释了很多,但是字典在dealoc方法中不会超出范围吗?是的,它使用简单的赋值。dealloc方法中必须发布的是DictAllValue吗?@Justin“超出范围”是什么意思?通过
alloc
创建对象,您成为了对象的所有者,因此需要在完成后调用
release
autorelease
。现在,您在当前方法中发出“我不再需要这个对象”的信号,因此对象(及其内容)被丢弃。如果您计划以后使用它(而且您似乎已经这样做了,因为您已经创建了一个局部属性),请暂时保存它。是的,我知道,这就是我要做的,但字典在类方法中声明为局部变量;如果我在-(void)dealloc中引用它,它就不会知道我在说什么,你的意思是把[dictAllValues release]放在dealloc方法中吗?我已经把它放在那里了,所以我假设它现在的样子很好?@Justin如果
dictAllValues
属性使用简单赋值,那么它引用与局部变量
dictionary
相同的对象。注意,您不释放引用,而是释放它们指向的对象。因此,您可以在当前方法(init?)中创建一个对象,并在
dealloc
中释放它
dictAllValues
引用用于定位对象。假定OP遵循
allDictValues
的传统
@属性
声明,则OP发布的代码通常是正确的。没有足够的信息可以像这个答案(和评论)那样得出任何结论。如果您正在修改字典。。。使用NSMutableDictionary而不是NSDictionary