2011-11-01 82 views
347

外我發現了一個錯誤分配塊內的變量的變量塊

變量不可分配(缺少__block類型說明符)

。我怎樣才能確保塊可以訪問變量aPerson變量和aPerson變量可以返回?

Person *aPerson = nil; 

[participants enumerateObjectsUsingBlock:^(id obj, NSUInteger idx, BOOL *stop) { 
    Person *participant = (Person*)obj; 

    if ([participant.gender isEqualToString:@"M"]) { 
     aPerson = participant; 
     *stop = YES; 
    } 
}]; 

return aPerson; 

回答

699

您需要使用此行代碼來解決問題:

__block Person *aPerson = nil; 

欲瞭解更多詳情,請參閱本教程:Blocks and Variables

+95

請注意,'__block'前綴爲**兩個**下劃線。 –

+9

使用'__block'我的錯誤消失了,但是值並沒有被擋住。這裏的任何幫助 – User16119012

+7

塊被稱爲它應該被調用的地方,換句話說,塊不會立即運行。 –

10

要分配的內部塊的變量哪家塊總是使用__block說明符之前,該變量您的代碼應該是這樣的: -

__block Person *aPerson = nil; 
16

只需使用__block前綴來聲明和分配塊內的任何類型的變量。

例如:

__block Person *aPerson = nil; 

__block NSString *name = nil; 
30

一個錯誤我自己也一樣,

__block 

聲明必須在第一次聲明變量來完成的只是一個提醒,那就是,外塊,不在裏面。這應該可以解決有關該變量未在塊之外保留其值的變量中提到的問題。

9
__block Person *aPerson = nil; 
2

嘗試__weak,如果你得到關於保留週期別人使用__block

Person *strongPerson = [Person new]; 
__weak Person *weakPerson = person; 

現在,你可以參考裏面塊weakPerson對象中的任何警告。

3

yes block是最常用的功能,所以爲了避免保留週期,我們應該避免使用強變量,包括block內的self,儘管使用_weak或weakself。