2014-01-31 22 views
1

由於未能注意到[NSArray計數]爲unsigned,我一遍又一遍地創建了錯誤。今天的例子是相對不尋常的:來自[NSArray計數]的常量錯誤未簽名

for (int i = -1; i < [myArray count]; i++) { 

這個循環從不執行!你需要(int)[myArray count]。我通常犯的錯誤是:

for (int i = 0; i < [myArray count] - 1; i++) { 

如果數組是空的,這個循環執行基本上永遠因爲[myArray count]-1溢出unsigned int

我做盡可能使用快速列舉,但在這個項目中,我經常需要在指標i-1i+1指物體在處理對象i,它似乎並沒有給自己借錢給。任何其他的提示,以避免這些錯誤,除了不那麼無能?

+0

訪問數組中的索引值低於零的對象將導致崩潰。所以,最簡單的事情就是在寫循環時最好小心。 – Volker

+0

嗯,我想知道爲什麼相關的編譯器警告被關閉。我沒有故意改變默認設置。下面的iOS_Pradip認爲這是Xcode中的新功能。 – Nestor

回答

5

首先,有您可以打開拿起這些問題的警告。我認爲這是「符號比較」,命令行標誌是-Wsign-compare

如果你想遍歷數組中的元素,但你需要的指數,最巧妙的方法(在我看來)是-enumerateObjectsUsingBlock:

[myArray enumerateObjectsUsingBlock: ^(id obj, NSUInteger idx, BOOL *stop) 
{ 
    NSlog(@"Object at index %lu is %@", (unsigned long) idx, obj); 
    if (idx > 0) 
    { 
     NSlog(@"Previous object is %@", [myArray objectAtIndex: idx - 1]); 
    } 
    if (idx + 1 < [myArray count]) 
    { 
     NSlog(@"Next object is %@", [myArray objectAtIndex: idx + 1]); 
    } 
}]; 
+0

現在你在說話! – Nestor

+0

另請注意匹配類型。如果你正在迭代一個數字,你的計數器應該是相同的類型。這不是必需的,但它會給你所有你可能得到的東西。 – uchuugaka

2

你仍然可以使用索引,而做快速列舉,只是做:

for (id object in myArray) 
{ 
    NSInteger anIndex=[myArray indexOfObject:object]; 
} 
+0

這會使代碼更加整潔。我不知道'indexOfObject'調用的速度有多快?我想它必須按順序搜索整個陣列。 – Nestor

+3

我想它可能會很慢 – Volker

+0

是的,它可能會很慢,但考慮到你的龐大陣列,它可能是唯一的解決方案,除非你嘗試重新設計你的程序來適應更小的陣列 –

0

按我的建議, 你可以用安東尼MG去回答

而你要那麼循環試試下面的代碼

int totalObj = myArray.count-1; 
for (int i = 0; i<totalObj; i++) { 
    // Write your code 
} 
+0

它是一個新的Xcode問題。 蘋果改變了一些彙編旗幟,我不知道這是怎麼發生的。 –

-1

JeremyP的回答是最好的。如果由於某種原因,您不想使用快速枚舉來運行for循環,則建議您只學習爲索引使用無符號整數。

for (NSUInteger i = 0; i < something.count; i++) { 
    ... 
} 
+0

我不確定這對於給出的任何示例都有幫助。 – Nestor