经过 3 个小时左右的时间,我终于成功修复了 View Controller 中的内存泄漏问题。泄漏是由 UIPickerView 在头文件中将其属性设置为“保留”引起的。
以下代码成功修复了该问题:
- (void)viewDidLoad {
[super viewDidLoad];
myPicker = [[[UIPickerView alloc] initWithFrame:CGRectZero]autorelease];
}
- (void)dealloc {
[super dealloc];
[myPicker release];
myPicker = nil;
}
请不要告诉我这段代码有多么令人震惊......我知道这很糟糕。我有一个版本,和一个自动版本。问题是,如果我更改或删除上述任何部分,内存泄漏就会再次出现。
我虽然知道客观的 C 内存管理是如何工作的,但显然不知道......
为什么上面的代码修复了内存泄漏,代码的正确版本可能是什么样子?
-
编辑:
如果有人有同样的问题,或者有兴趣 - 问题是我的类中的其他对象之一被设置为“保留”而不是“分配”。 (如果您不拥有某个对象,则它应该具有分配属性,而不是保留属性)。
就像 Cannondale 所说,删除额外的保留可以解决所有问题,并且只需要一个版本。
最佳答案
您必须在代码中的其他位置对 myPicker 进行保留。一旦堆栈为 viewDidLoad 调用展开(这就是自动释放告诉它执行的操作),您的 myPicker 分配行将立即释放该内存。
在那之后,您必须在某个地方进行保留,否则您的 [myPicker 版本] 将尝试释放未分配的内存,结果不可预测。
您应该做的是在 viewDidLoad 中分配内存(因此删除自动释放)。确保您没有在其他地方保留该对象,并从 dealloc 中释放 myPicker。
还有...什么bbum说重新分配;)
关于iphone - Objective-C 内存管理 - 很确定我做错了,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4687937/