2012-12-12 32 views
-2

我在iOS開發人員的一些代碼中看到。它有一些代碼如下:有人解釋一些代碼嗎?

void (^block)(NSUInteger buttonIndex, UIAlertView *alertView) = objc_getAssociatedObject(self, "blockCallback"); 

不過。我不明白爲什麼分配對象自我來阻止代碼。該方法的完整代碼是:

- (void)alertView:(UIAlertView *)alertView clickedButtonAtIndex:(NSInteger)buttonIndex { 
    void (^block)(NSUInteger buttonIndex, UIAlertView *alertView) = objc_getAssociatedObject(self, "blockCallback"); 
    if (block) { 
     block(buttonIndex, self); 
    } 
} 
+0

這是完全代碼: - (無效)alertView:(UIAlertView中*)alertView clickedButtonAtIndex:(NSInteger的)buttonIndex { \t空隙(^塊)(NSUInteger buttonIndex,UIAlertView中* alertView)= objc_getAssociatedObject(個體,「 blockCallback「);如果(塊){block1(buttonIndex,self); } \t } –

+0

它看起來像一個使用塊代替委託的警報視圖類別。你不明白哪一點? – jrturton

+0

我不明白,爲什麼在block中分配給objc_getAsscociated的塊需要一些參數。 –

回答

1

正在使用一個類別爲UIAlertView添加基於塊的功能。這意味着您不必爲警報視圖實現委託方法,您可以在創建時替代它。

但是,類別不允許您將實例變量添加到對象。在這種情況下,塊需要被存儲,以便當用戶點擊警報視圖上的按鈕時可以執行這些塊。

爲了解決這個問題,程序員使用了關聯的對象,它們允許您在編寫類別代碼時添加僞ivars。搜索Objective-C關聯對象以獲取更多信息。