iphone - Objective-C 内存管理 - 很确定我做错了

标签 iphone objective-c memory-management

经过 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/

相关文章:

ios - 如何设置按钮标题的字体 Objective-C

objective-c - 带有 BOOL 标志的应用程序状态

php - 安全使用 PHP ini_set "memory_limit"

iphone - 如何使用iphone sdk将XML解析的图像放入数组并在所有 View Controller 中使用该数组

ios - 是否可以在后台运行 CLLocationManager

ios - 在 obj-c 中调用类方法时出错

c - 在C/C++程序中,如何为参数 vector 内存分配内存?

iOS 7 停止自动旋转

iphone - 如何将视网膜图像添加到svn

java - static 关键字是否会阻止将新对象分配给变量?