gpt4 book ai didi

iphone - ARC 在 block 内捕获 self... block 并在执行前释放引用

转载 作者:行者123 更新时间:2023-12-01 17:42:31 24 4
gpt4 key购买 nike

我有这个问题: block 内的 block 。

  self.createStuff = ^ (NSString *text) {       
self.post.onCompletion = ^(NSURLResponse *response, NSData *data, NSError *error){
[self doStuff]; // error here
};
[self doMoreStuff]; // error here
};

我会在 [self doStuff] 和 [self doMoreStuff] 中出现错误。错误是 在此 block 中强烈捕获“自我”可能会导致保留周期

你说的简单,只需添加
id mySelf = self; 

在第一个 block 之前并使用 mySelf 代替。

没有。这不会解决我的问题,仅仅是因为 mySelf 是一种 id 不会给我第二行需要的 post 属性。所以我需要像这样声明它
MyClass *mySelf = self;

使它像:
MyClass *mySelf = self;

self.createStuff = ^ (NSString *text) {
mySelf.post.onCompletion = ^(NSURLResponse *response, NSData *data, NSError *error){
[self doStuff]; // error here
};
[mySelf doMoreStuff];
};

好吧,你说,现在 self.post.onCompletion 行和 doMoreStuff 不再提示了,但是我们在 onCompletion 里面还有另一个 self... 因为这是 block 中的 block 。我可以重复创建另一个弱引用的过程,例如,这必须是对弱引用的弱引用
MyClass *internalMyself = mySelf;

并使用
   [internalMyself doStuff];

在我看来,这似乎是一种非常可悲的方法,而且当此方法运行时,应用程序会挂起。在方法执行之前,像引用之类的东西正在被释放......

我该如何解决这个字谜?

谢谢。

注意:这是正在编译到 iOS 6+

最佳答案

你很接近。只需更换您的解决方案

MyClass *mySelf = self;

self.createStuff = ^ (NSString *text) {
mySelf.post.onCompletion = ^(NSURLResponse *response, NSData *data, NSError *error) {
[self doStuff]; // error here
};
[mySelf doMoreStuff];
};


__weak MyClass *mySelf = self;

self.createStuff = ^ (NSString *text) {
mySelf.post.onCompletion = ^(NSURLResponse *response, NSData *data, NSError *error) {
[self doStuff]; // error here
};
[mySelf doMoreStuff];
};

第一个解决方案的问题是 mySelf未指定 weak ,所以它的所有权限定符是隐含的 __strong ( see LLVM's documentation)。我不确定为什么这会消除第一个 block 中的警告,但指定引用 __weak将完全删除保留周期。

关于iphone - ARC 在 block 内捕获 self... block 并在执行前释放引用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14667610/

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