gpt4 book ai didi

ios - 我什么时候以及为什么要使用 ARC 将局部变量声明为 __weak?

转载 作者:可可西里 更新时间:2023-11-01 04:24:02 27 4
gpt4 key购买 nike

Mike Ash has written this introduction to ARC 他介绍了类似的东西:

__weak Foo *_weakFoo = [object foo];

为什么我要对局部临时变量执行此操作? __weak 是一个归零引用,一旦被引用的对象被释放,它就会自动将 _weakFoo 指针设置为 nil。此外,__weak 仅在 iOS >= 5 中可用。

我什么时候简单地这样做会遇到麻烦?:

Foo *_weakFoo = [object foo];

这总是期望返回一个对象或 nil。我的猜测是:

Foo *_weakFoo = [object foo];
[self doSomethingStupid]; // does something bad so foo gets deallocated
[_weakFoo doIt]; // CRASH! msg sent to deallocated instance 0x123456

ARC 仍然困扰我的一件事是:它什么时候知道我不再需要某个对象了?我会争辩说,当我将指针设置为 nil 或指向其他东西时,它会发现该所有者不再需要以前引用的对象,因此可能会消失。但重点是:我将其设置为零。所以无论如何它都是零!

那么 __weak 对于局部变量什么时候有意义,我必须在其他地方做什么样的疯狂事情才能真正需要它?

最佳答案

如果我必须在 block 内操作 self 以避免保留循环,我会使用 __weak 局部变量。考虑这个示例,我使用 GCD 和 block 来执行对字符串的网络请求,然后将其设置在类声明的标签上,在本例中为 TurtlesViewController

__weak TurtlesViewController *weakSelf = self;
dispatch_queue_t networkQueue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0);

dispatch_async(networkQueue, ^{

// Kick off a network task for some data that is going to populate a label declared on our class
NSString *returnString = [networkDataSource retrieveTurtleTime];

// Dispatch back to the main thread to populate the UILabel
dispatch_async(dispatch_get_main_queue(), ^{

// Using self.label here creates a retain cycle. Self owns the block and the block has captured self
self.label.text = returnString;

// Instead, we use weakSelf for our reference to the label as it will be torn down by ARC at the end of the loop.
weakSelf.label.text = returnString;
});
});

关于ios - 我什么时候以及为什么要使用 ARC 将局部变量声明为 __weak?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8806193/

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