2013-05-08 23 views
1

下面的代碼工作正常,我只是不知道發佈應該去哪裏,因爲我不知道規則是什麼。我沒有使用ARC。如何使用帶有__block變量的版本?

- (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 
} 
+0

p.s.沒有理由在'photo'上使用'__block',因爲'photo'沒有被分配到任何地方 – newacct 2013-05-08 10:23:53

+0

把'[photo release]放在'dispatch_async'塊內部的末尾不應該引起任何問題。您的問題必須是由您未顯示的內容引起的。 – newacct 2013-05-08 20:07:11

回答

0

如果我理解的文檔右側 (尋找塊存儲類型對象和塊的變量here ,沒有必要保留您的照片變量: 「__block變量活在變量的詞法範圍和在變量的詞法範圍內聲明或創建的所有塊和塊拷貝之間共享的存儲中。因此,如果框架中聲明的塊的任何副本存活,則存儲將在存儲棧幀後繼續存活超出框架的結尾「。
但這不能解釋爲什麼你得到EXC_BAD_ACCESS。

+0

你錯過了這一點。 *變量*(一個指針)位於共享存儲上。它指向的*對象需要保留和釋放。 – newacct 2013-05-08 10:22:31

+0

@newacct:謝謝你指出這一點。無論如何,我不完全確定(「如果我理解文檔的權利......」)。 – 2013-05-08 11:35:37