2012-11-05 52 views
2

的給予在蘋果塊文檔中的代碼示例不寫:不理解的例子塊範圍

void dontDoThisEither() { 
    void (^block) (void); 
    int i = random(); 
    if (i > 1000) { 
    block = ^{printf("got i at: %d\n", i); }; 
    } 
    // ... 
} 

的代碼中的註釋說塊字面範圍是「那麼」條款。 我不明白他們是什麼意思,沒有那個條款,這可能是爲什麼他們把它放在引號中。但是爲什麼他們把它放在引號中,與塊的範圍有什麼關係呢?

+0

「then」子句表示「if(i> 1000)」之後'{}'內的部分。在if語句中,條件爲真時的語句/塊可以稱爲then-clause,當條件爲假時語句/塊可以稱爲else-clause。 – nhahtdh

+0

你可以發佈鏈接到說這個文檔嗎? – jere

+0

http://developer.apple.com/library/ios/#documentation/cocoa/conceptual/Blocks/Articles/bxUsing.html – Gruntcakes

回答

2

想到一個if語句爲: 如果那麼其他這另一件事

{... block = ...}是在那麼if聲明,即一部分。也就是說,它是dontDoThisEither()函數範圍的子範圍。

由於塊被創建於棧,並且僅其聲明的範圍內有效,這意味着,在該示例中的塊分配是內有效的,則該語句if範圍

I.e.試想一下:

void dontDoThisEither() { 
    void (^block) (void); 
    int i = random(); 
    if (i > 1000) { 
    block = ^{printf("got i at: %d\n", i); }; 
    } else { 
    block = ^{printf("your number is weak and small. ignored.\n");}; 
    } 
    block(); 
} 

當時block();執行,它是指向區塊是在一個範圍內即不再有效,行爲將是不確定的(和在現實世界的例子可能crashy)。

+0

那麼你將如何有條件地指定某個塊? – jere

+0

複製內部作用域中的塊並在完成後釋放它。 – bbum

+1

注意這個答案是在ARC下的變化 - 變量'block'很強,對它的賦值導致一個保留,在ARC下導致塊被從堆棧複製到堆中。所以'dontDoThisEither'在ARC下有效。 [在Xcode 4.4.1中確認] – CRD