gpt4 book ai didi

ios - block block block ,用 __weak self

转载 作者:可可西里 更新时间:2023-11-01 05:23:01 25 4
gpt4 key购买 nike

我想弄清楚我这样做是否正确:

如果我有一个 block ,我会这样做:

__weak MyClass *weakSelf = self;  
[self performBlock:^{ //<< Should I use self, or weakSelf here?

[weakSelf doSomething];

} afterDelay:delay];

但是如果一个 block 中有一个 block 会发生什么?这是正确的吗?

__weak MyClass *weakSelf = self;
[self performBlock:^{

[weakSelf doSomething];

[self performBlock:^{

[weakSelf doSomething];
} afterDelay:1.0f];

} afterDelay:delay];

另外,在下面的函数中,是否需要使用[block copy]?

- (void)performBlock:(void (^)(void))block afterDelay:(float)delay
{
if (block)
{
if (delay > 0)
{
[self performSelector:@selector(executeBlockAfterDelay:) withObject:[block copy] afterDelay:delay];
}
else
{
[self executeBlockAfterDelay:[block copy]];
}
}
}

- (void)executeBlockAfterDelay:(void(^)(void))block
{
if (block)
block();
}

最佳答案

在这种情况下(如下)只使用 strong self,因为 block 只是在那几秒钟被复制。通常,如果您希望 self 执行 block ,您希望它一直存活到那个时候,所以强引用是完全可以的。

[self performBlock:^{
[self doSomething]; // strong is OK
} afterDelay:delay];

嵌套block?在你的情况下,这两个 block 只是延迟的单发 block ,所以和上面一样,使用强。但是block之间是有区别的。如果您将 block 存储较长时间,也许对于多次调用您应该避免保留周期。

示例:

self.callback = ^{
[self doSomething]; // should use weakSelf
};

可能导致循环保留。事实上,这取决于 block 的使用方式。我们看到该 block 存储(复制)在属性中供以后使用。但是,您可以通过取消不再使用的 block 来防止保留循环。在这种情况下:

self.callback(); //invoke
self.callback = nil; //release

使用 ARC 时,您不必自己复制 block 。早期版本添加 block 后有错误,但现在 ARC 下的编译器知道何时复制 block 。在这种情况下复制它就足够聪明了:

[self performSelector:@selector(executeBlockAfterDelay:) withObject:block afterDelay:delay];

关于ios - block block block ,用 __weak self,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15448518/

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