ios - 当一个 block 试图将自己设置为 nil 时,如何避免保留循环警告?

标签 ios objective-c

我正在阅读 SimpleAudioPlayer 的源代码并发现当 playBlock 尝试将其自身设置为 nil 时,Xcode 会发出警告。

我不知道如何摆脱这个警告,或者我们必须将 playBlock 设置为 nil?

- (void) playFiles:(NSArray*) filesList withCompletionBlock:(CompletionBlock) completion
{
    __block int idx = 0;
    __block void(^playBlock)();
    playBlock = ^() {
        if (idx >= filesList.count) {
            if (completion) {
                completion ( YES );
            }
            playBlock = nil; //Capturing 'playBlock' strongly in this block is likely to lead to a retain cycle
            return ;
        }
        [self playFile:filesList[idx] withCompletionBlock:^(BOOL completed) {
            playBlock ();
        }];
        idx ++;
    };

    playBlock ();
}

最佳答案

无需设置 playBlock = nil; 也无需使用 __block 修饰符进行声明。修改后的代码(见下文)编译时没有警告或错误。

- (void) playFiles:(NSArray*) filesList withCompletionBlock:(CompletionBlock) completion
{
    __block int idx = 0;
    void(^playBlock)();
    playBlock = ^() {
        if (idx >= filesList.count) {
            if (completion) {
                completion ( YES );
            }
            return ;
        }
        [self playFile:filesList[idx] withCompletionBlock:^(BOOL completed) {
            playBlock ();
        }];
        idx ++;
    };

    playBlock ();
}

关于ios - 当一个 block 试图将自己设置为 nil 时,如何避免保留循环警告?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27959720/

相关文章:

ios - Swift 编译器错误 : Header not found

ios - AFNetworking 发送带有请求的 header

ios - 将 UIImage 转换为 NSData 并与核心数据一起保存

ios - NSAttributedString 中字距调整的不一致行为

ios tableview 图像不释放内存

ios - 如何使用 CKModifyRecordsOperation.perRecordProgressBlock 更新进度

objective-c - XCode Instruments 发现内存泄漏 : why?

ios - 如何从 NSDate 获得 1 小时的 future 时差

ios - 无法从 iOS 中的 UITextView 中获取已删除的字符

ios - heightForImageCellAtIndexPath 中 dispatch_once 的原因