2012-10-23 189 views
0

這是apple blocks docs,我難以理解這個可以請任何一個小簡單的方法需要幫助理解的Objective-C塊

解釋......你可以蒙上塊參照的任意一個指針類型和 反之亦然。但是,您不能通過 指針解引用運算符(*)取消引用塊引用 - 因此在編譯時計算的塊大小不能爲 。

+2

[This](http://www.cocoawithlove.com/2009/10/ugly-side-of-blocks-explicit.html?m=1)應該回答你的問題,等等。 – CodaFi

+0

感謝您的鏈接。 –

回答

3

簡而言之,塊是參考。塊內的代碼存儲在內存中,可以通過變量訪問。 void (^addingBlock)(int);是一個塊聲明,可以通過addBlock變量訪問(如在,它可以被稱爲像addingBlock(5);)。

現在,這個引用可以被轉換成C識別的指針類型。有點像一個函數指針。正如文檔所述,唯一的視覺差異是使用*而不是^。這意味着你可以施放塊函數指針:(!或任何類型)

void (*funcPointer)(int) = (void(*)(int))addingBlock; 

甚至一個空指針

void* voidPtr = (void*)addingBlock; 

但是,您所提供的報價說,是與這個指向塊的指針,你不能'取消引用'它。這意味着解釋指針地址,並獲取該地址後面的數據。無法做到這一點意味着您無法在編譯時確定其大小。

爲什麼?由於Obj-C的動態性,塊的內容只能在運行時確定,而C本質上是相當靜態的,並且在編譯時確定很多。

+0

非常感謝您解決我的困惑。 –