2013-01-31 30 views
3

經過[block copy]並執行block();,我應該設置block=nil?或者ARC已經爲我管理這個,所以我不需要做任何事情? 我對ARC在這裏如何管理塊引用有點困惑,我不確定將塊設置爲零會破壞什麼或不是?我應該將塊引用設置爲nil AFTER執行嗎?

我有這樣的事情。有什麼想法嗎?

typedef void (^C3Block)(void); // declare block, no return, no args 

// set flag to get _previewImage, then call the block 
- (void)takePreviewImageFromBufferWithBlock:(C3Block)block { 
    _takePreviewImageBlock = [block copy]; // save block ref for calling later 
    _shouldTakePreviewImageFromBuffer = YES; 
} 

- (void)gotPreviewImageFromBuffer { 
    _takePreviewImageBlock(); // calls the block 
    _takePreviewImageBlock = nil; // <---- should I do this??? 
} 

回答

5

我認爲這是將其設置爲nil一個好主意,這是爲什麼:

我們稱之爲類的這些方法都在ImageLoader。假設我有一個類MyViewController,它對此ImageLoader(它是一個實例變量)有強烈的參考,並將它傳遞給保留self(即MyViewController)的塊。爲什麼它保留self?那麼,你的ImageLoader大概是異步工作,所以說,我想我的MyViewController足夠長的時間來處理響應。

好的,所以我們有一個保留週期。 MyViewController保留ImageLoader,其中保留該塊,其保留MyViewController。但是,如果您在ImageLoader的操作結束時只是nil塊變量,它將打破此循環。否則,這些對象將永遠不會被釋放。當ImageLoader的操作完成後,它將塊變量設置爲nil,因爲它不再「需要」它,因此這種方法很有意義。

(你也可以說,在上面可以通過設置來避免場景中的問題保留不同 - 這MyViewController應該保留ImageLoader然後,在異步操作過程中,必須ImageLoader仍然可以通過保留的東西從正在進行的操作。ImageLoader仍保留其保留MyViewController塊。當操作完成後,釋放ImageLoader操作將釋放一切,每個人都很開心,而無需設置塊變量nil

+0

如此,你的意思是設置集團在操作結束時k變量'nil'將有助於**解除分配塊,並且其保留的'self'也將被解除分配。 – Hlung

+0

@Hlung:好的,當一個堆塊被釋放時,它釋放它保留的捕獲變量 – newacct

2

一般來說,在你的塊伊娃設置爲零,因爲你很可能將連續-takePreviewImageFromBufferWithBlock:呼叫復位沒有任何意義。從內存管理的角度來看,_takePreviewBlock是一個iVar,它的ARC管理將與任何其他iVar相同 - 當所有者類被釋放時,它將在沒有您的交互的情況下正確發佈。

2

如果_takePreviewImageBlock屬性爲屬性,那麼只要包含此屬性的對象存在,ARC將保留它。
正如@Eugene所述,它會在撥打takePreviewImageFromBufferWithBlock:後重置。

瞭解此行爲後,您應該確定它是否適合您的設計。如果業主立即撤銷分配,則無需自行清除其屬性。否則,如果此塊與您的邏輯不再相關,則應該將其忽略,並且它將無緣無故地駐留在內存中。

相關問題