2013-03-01 42 views
0

我在某處看到以下三個代碼正在做同樣的事情。控制iOS上的數組迭代的變量5

使用循環:

BOOL stop = 0; 
for (int i = 0 ; i < [theArray count] ; i++) { 
    NSLog(@"The object at index %d is %@",i,[theArray objectAtIndex:i]); 
    if (stop) 
     break; 
} 

使用快速列舉:

int idx = 0; 
BOOL stop = 1; 

for (id obj in theArray) { 
    NSLog(@"fast emuration approch @ x %d is %@",idx,obj); 
    if (stop) 
     break; 
    idx++; 
} 

使用塊:

[theArray enumerateObjectsUsingBlock:^(id obj, NSUInteger idx, BOOL *stop){ 

    NSLog(@"the block approch at x %d is %@",idx,obj); 
}]; 

但我不明白的是 -

  1. 如何在塊方法中設置從外部停止?
  2. 如何在塊方法中設置idx?
  3. 布爾聲明在塊方法中是不尋常的。爲什麼? (因爲我沒能塊還將內更改值,是不是因爲這樣的聲明?)

回答

2
  1. 您只能更改值指向stop塊內 - 但至於語義但是,在其他方法中,除非您使用範圍更廣的變量(由示例代碼指示並在另一個線程上操作它),否則無法在其他方法中執行任何操作。
  2. 你不能。您在代碼塊中編寫的代碼實質上就是您的循環體,並且idxstop從塊的調用上下文傳遞,它們用於控制該上下文內的迭代。我的意思是,在執行enumerateObjectsUsingBlock:方法時,它會像在快速枚舉方法中那樣設置當地人idxstop,並將它們作爲參數傳遞給塊。
  3. 您會收到一個指向BOOL的指針,您可以更改調用者看到的值。也就是說,從您設置*stopYES的塊內以及enumerateObjectsUsingBlock:的實施將會看到其本地變量stop已被設置爲YES。這是C.
  4. 通過引用返回多個參數
+0

感謝卡爾...但是,當我們設置我......我們初始化它的價值..在這裏,我無法初始化價值......當我在爭論中這樣做時,它給了我警告。 – 2013-03-01 05:53:18

+0

並且它不允許我在指針內更改BOOL的值......我不明白爲什麼它在那裏被聲明爲指針? – 2013-03-01 05:54:31

+0

對不起,你能否以不同的方式說出來?什麼說法?關於你的第二個問題 - 當你需要停止迭代時,執行'* stop = YES;'它們給你一個指針,這樣你就可以在調用上下文中操作變量的值,就像在函數調用中一樣。 – 2013-03-01 05:58:58

0

試試這個的典型方式:

__block bool stop = YES; 
__block NSUInteger idx = 0; 

[theArray enumerateObjectsUsingBlock:^(id obj){ 

    NSLog(@"the block approch at x %d is %@",idx,obj); 
    idx++; 

}]; 
+0

嘿,我也可以這樣做...我也可以聲明變量外,也可以執行操作,如你所說...短而甜..很好..謝謝:) – 2013-03-01 06:41:07