你应该如何使用__block变量释放?

时间:2013-05-08 06:28:35

标签: ios memory-management objective-c-blocks

下面的代码运行正常,我只是不知道发布应该去哪里,因为我不确定规则是什么。我没有使用ARC。

- (void)myFunc {

    // stuff happens

    __block UIImage* photo = [UIImage imageWithCGImage:croppedCGImage];

    [photo retain];

    dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT,
                                         (unsigned long)NULL), ^(void) {
        [self doStuffToPhoto:photo];
        // [photo release] causes EXC_BAD_ACCESS
    });

    // [photo release] causes EXC_BAD_ACCESS in doStuffToPhoto
}

- (void)doStuffToPhoto:(UIImage*)photo {
    // do stuff
    // [photo release] causes EXC_BAD_ACCESS
} 

1 个答案:

答案 0 :(得分:0)

如果我理解文档正确(查找块存储类型对象和块变量 here,不需要保留你的照片变量:“__block变量存在于变量的词法范围和在变量的词法范围内声明或创建的所有块和块副本之间共享的存储中。因此,如果框架内声明的块的任何副本存活超出框架的末尾,则存储将在堆栈框架的破坏中存活。“ 但这并没有解释为什么你得到EXC_BAD_ACCESS。