gpt4 book ai didi

objective-c - 使用 block 和 ARC 进行内存管理,泄漏?

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

我需要知道我是否做得正确。应用程序运行正常,但我不确定生命周期是否正确(泄漏?)。

注意:仪器未发现泄漏。

某个类A的方法aaa:的代码:

- (void) aaa {
NSString *path = ...something...;

NSBlockOperation* theOp = [NSBlockOperation blockOperationWithBlock: ^{
// using path
[self somethingElseWith:path];
}];

[self.aQueue addOperation:theOp];
}

因此,我创建了一个 block 来放入 aQueue (NSOperationQueue*)。目标是从主线程卸载长时间运行的 SomethingElseWith: 方法,以便 GUI 继续响应。

在 block 内,我引用了本地变量“路径”,该路径在 aaa: 方法末尾将超出范围。

如果我正确地阅读了文档,该 block 将在“路径”上进行保留。但是 ARC 是否在该 block 的末尾隐式插入了一个版本?既符合逻辑又很好。

或者我应该将“path”声明为 __block 并在 block 末尾将其分配为 nil 吗? (手动...)

不确定我是否理解如何在这种情况下使用 __weak。

最佳答案

path 变量没问题。但是,您可能需要通过使用对 self引用来避免保留周期。如果aQueue是一个strong引用,则可能存在一个保留周期,导致self永远不会被释放。

解决方案:

- (void) aaa {
NSString *path = ...something...;

__weak id self_ = self;
NSBlockOperation* theOp = [NSBlockOperation blockOperationWithBlock: ^{
// using path
[self_ somethingElseWith:path];
}];

[self.aQueue addOperation:theOp];
}

确保在该类不再存在后不会调用该操作。

关于objective-c - 使用 block 和 ARC 进行内存管理,泄漏?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9398207/

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