gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-03 20:23:41 25 4
gpt4 key购买 nike

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

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com