Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/api/5.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 使用从应用程序委托调用的RootViewController中的NSMutableArray发生内存泄漏_Iphone_Xcode_Memory_Nsmutablearray_Memory Leaks - Fatal编程技术网

Iphone 使用从应用程序委托调用的RootViewController中的NSMutableArray发生内存泄漏

Iphone 使用从应用程序委托调用的RootViewController中的NSMutableArray发生内存泄漏,iphone,xcode,memory,nsmutablearray,memory-leaks,Iphone,Xcode,Memory,Nsmutablearray,Memory Leaks,我已经编写了恢复应用程序状态的代码,但NSMutableArray中存在内存泄漏。我是Xcode新手,所以如果我忽略了一些琐碎的事情,我很抱歉。感谢您的帮助。 lq 如果在viewDidUnload中将其设置为nil,那么在dealloc中将发布什么? 你应该这么做 self.offendingNSMutableArray = nil; 在dealloc中,这是保留属性的常见方式 编辑:现在从上面的评论中查看。在执行alloc/init的地方需要自动释放。属性设置器将执行保留操作。好的,因此看

我已经编写了恢复应用程序状态的代码,但NSMutableArray中存在内存泄漏。我是Xcode新手,所以如果我忽略了一些琐碎的事情,我很抱歉。感谢您的帮助。 lq

如果在viewDidUnload中将其设置为nil,那么在dealloc中将发布什么? 你应该这么做

self.offendingNSMutableArray = nil;
在dealloc中,这是保留属性的常见方式


编辑:现在从上面的评论中查看。在执行alloc/init的地方需要自动释放。属性设置器将执行保留操作。

好的,因此看起来我通过添加自动释放解决了泄漏问题:

- (void)restoreState {
    // Gets an array stored in the user defaults plist
    NSUserDefaults *userDefaults = [NSUserDefaults standardUserDefaults];
    self.offendingNSMutableArray = [[[NSMutableArray alloc]    
        initWithArray:[userDefaults objectForKey:kArrayValue]] autorelease];
}

但我想我不想使用autorelease,因为我在应用程序的其他位置引用了有问题的NSMutableArray?

首先,您使用retainCount=1分配init,然后设置有问题的NSMutableArray:->retainCount=2。在viewDidUnload中,您将其设置为nil,因此retainCount=1,并且您失去了指向数组的指针。这是你的漏洞。对不起,我是新来的。。。我不是alloc init并与以下代码行在同一行中设置的:self.officingnsmutablearray=[[NSMutableArray alloc]initWithArray:[userDefaults objectForKey:kArrayValue]];使用仪器,我在alloc init行上显示泄漏的对象:Malloc 32字节,在alloc init行上显示泄漏的对象:NSCFArray。这里的知名Obj-C人士告诉我,在dealloc中调用属性设置程序是一个坏主意,因为它可能会导致触发通知,这在拆卸过程中是不希望的。至于内存泄漏-当然有一个,请参阅@beefon的评论。@walkytalky这是这里推荐的。是的,我现在看到了漏洞,我的巴德在那篇文档中关于dealloc的部分说:注意:通常在dealloc方法中,您应该直接释放对象实例变量,而不是调用set访问器并将nil作为参数传递。合成ivar的情况有一个例外,直接释放不是一个选项,但在其他情况下,这似乎非常明确。好吧,继续读下一句。当然,每个人都在使用现代运行时和合成,还有什么呢?setter将为自己保留对象。此自动释放放弃您通过alloc获得的本地所有权。像这样把所有内容放在一行中会使语义有点不透明——在一行中alloc/init,在第二行中赋值,然后在第三行中显式释放会更清晰——但最终结果几乎是一样的。
- (void)restoreState {
    // Gets an array stored in the user defaults plist
    NSUserDefaults *userDefaults = [NSUserDefaults standardUserDefaults];
    self.offendingNSMutableArray = [[[NSMutableArray alloc]    
        initWithArray:[userDefaults objectForKey:kArrayValue]] autorelease];
}