gpt4 book ai didi

iOS 内联 block 很好,但声明为变量的 block 会导致内存问题

转载 作者:塔克拉玛干 更新时间:2023-11-02 08:19:19 27 4
gpt4 key购买 nike

我有一组看起来像这样的代码:

if(self.property == A) {
[self.infoManager getThingA:^(NSString *thing, NSError *error) {
self.textView.text = thing;
}];
} else if(self.property == B) {
[self.infoManager getThingB:^(NSString *thing, NSError *error) {
self.textView.text = thing;
}];
}

基本上,在这两种情况下,他们只是获取要发布到 TextView 的字符串。字符串因调用的方法而异。

作为一个通常反对代码重复的人,我将其抽象为一个 block 变量:

void (^stringBlock)(NSString *thing, NSError *error) = ^void(NSString *thing, NSError *error) {
self.textView.text = thing;
}

if(self.property == A) {
[self.infoManager getThingA:stringBlock];
} else if(self.property == B) {
[self.infoManager getThingB:stringBlock];
}

有一段时间一切都很好。但是现在我在我的单元测试中遇到了错误,似乎 stringBlock 被释放得太早了。我认为这是因为在 block 运行后我得到了 EXC_BAD_ACCESS,调试器说 stringBlock 是 NULL。

我没有在我的方法或单元测试中明确复制 block 。

最佳答案

您在上面声明的 block 称为独立 block (其他类型称为内联 block ,类似于 java 中的内联匿名类)。使用独立 block 时,我们需要遵守一些规则。

1.你不能在Independent block对象中引用self。如果需要,您必须将自身对象作为参数传递给 block 。

2.您不能使用点表示法访问独立 block 内对象的属性。如果您需要这样做,请使用 setter 和 getter 方法。

...

所以在您的情况下,我们需要将 self 对象传递给 block ,如下所示。

void (^stringBlock)(NSString *thing, NSError *error, id self) = 
^void(NSString *thing, NSError *error, id self) {
self.textView.text = thing;
}

关于iOS 内联 block 很好,但声明为变量的 block 会导致内存问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21267833/

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