2011-01-13 41 views
4

參考下面的代碼,一旦塊被放入數組中,如何獲取該塊對象並運行塊中的實際代碼。Objective-C塊 - 用作對象

另一個問題:如果我在下面的塊中調用一個方法,該塊是否封裝了該方法中的代碼或者捕獲該方法的簽名並以此方式調用它?

-(void)blockCalledMethod 
{ 
    NSLog(@"Hello World"); 
} 

-(void)programStart 
{  

    NSArray * array = [[NSArray alloc] initWithObjects:[[^ { [self blockCalledMethod];} copy] autorelease],nil];  

    id pointerToBlock = [array lastObject]; 
} 

回答

7

這樣稱呼它:

void (^pointerToBlock)(void) = [array lastObject]; 
pointerToBlock(); // because^{} is void(^)(void) 

你不能聲明pointerToBlock作爲id如果你想直接調用它,因爲編譯器將其識別爲一個塊類型,而不僅僅是對象。

如果我在上面的塊中調用方法,該塊是否封裝了該方法中的代碼或者捕獲方法的簽名並以此方式調用它?

我認爲self指的是調用類。

+0

@BoltClock,我也認爲`^ {}`和`nil`不一樣,所以你不能測試它是否存在,是嗎? `如果(pointerToBlock)`不好?塊不是NSObject的子類,雖然它們可以存儲在容器中並作爲對象處理? – 2011-01-13 15:35:14