2013-03-21 47 views
1

我知道塊調用時,塊描述符在堆棧上傳遞給塊函數。有沒有我可以用它來指代這在我的代碼(如self_cmd的方法),變量名如何引用塊函數中的當前塊對象?

(^{ 
    // how can I access the block descriptor here? 
})(); 

編輯

其實我是想了塊對象,而不是塊描述符..

回答

6

總之,你不能。至少不是直接的(在塊中沒有任何類似於self--我們認爲這很長並且很難,但是根據以下模式無法提供既優雅也不足夠的東西來證明添加這樣的語法的合理性)。

如果你想參考塊,你需要做的是這樣的:

__block void(^strawberryFields)(); 
strawberryFields = ^{ strawberryFields(); }; 
strawberryFields(); 

注意上面將永遠運行。另請注意,如果您計劃稍後使用該塊,則可能需要在分配時複製該塊。


考慮:

NSMutableArray *array = [NSMutableArray array]; 
int i; 
for(i = 0; i<5; i++) { 
    [array addObject:[^{ return i*i; } copy]]; 
} 

您會以與陣列結了5塊,每個捕獲的i不同的值。

+0

此代碼也將創建一個保留週期... – 2013-03-21 18:48:36

+0

在其他的週期,是的。 :) – bbum 2013-03-21 18:49:11

+0

對不起 - 我沒有意識到塊描述符和塊不是同一個對象? – nielsbot 2013-03-21 18:56:05

2

它可能有助於爲您創建一個方法來初始化每個塊。下面是一個簡單的測試,演示每塊都有其自己的變量:

-(void (^)(void))intAddingBlock:(NSString *)name { 
    __block int intForThisBlock = 0; 
    return ^{ 
     NSLog(@"%@ before: %d", name, intForThisBlock); 
     intForThisBlock += 5; 
     NSLog(@"%@ after: %d", name, intForThisBlock); 
    }; 
} 

-(void)testTheBlock { 
    void(^block1)(void) = [self intAddingBlock:@"block 1"]; 
    void(^block2)(void) = [self intAddingBlock:@"block 2"]; 

    block1(); 
    block1(); 
    block2(); 
    block1(); 
    block2(); 
} 

輸出:

block 1 before: 0 
block 1 after: 5 
block 1 before: 5 
block 1 after: 10 
block 2 before: 0 
block 2 after: 5 
block 1 before: 10 
block 1 after: 15 
block 2 before: 5 
block 2 after: 10 
相關問題