ios - block block block ,用 __weak self

标签 ios objective-c xcode block

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

如果我有一个 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/

相关文章:

iphone - 在 iOS (iPhone/iPad/iPod) 上查找所有已注册的 mime 类型/url 方案协议(protocol)(意图过滤器)

objective-c - lua_touserdata 返回 null

ios - CGFloat比较错误

xcode - 如何使用Storyboard制作可以在代码中使用的popover?

ios - 将 Team Foundation Server (TFS) 与 Xcode 连接起来

php - swift 3.0 中的播放器 ID 格式问题

objective-c - JSON 返回值在 Objective-C : iOS 中被错误解析

jquery - ajax 请求中的 html() 在 iOS 设备上不起作用

ios - 如果在 .h 文件中声明,则需要分配和初始化对象

ios - iCloud 和核心数据不工作 - URLForUbiquityContainerIndentifier 是零