3 回答

TA貢獻1712條經驗 獲得超3個贊
10.5 + / iOS的一般首選代碼。
for (id object in array) {
// do something with object
}
此構造用于枚舉符合NSFastEnumeration協(xié)議的集合中的對象。這種方法具有速度優(yōu)勢,因為它將指向多個對象的指針(通過單個方法調用獲得)存儲在緩沖區(qū)中,并使用指針算法通過在緩沖區(qū)中前進來遍歷它們。這是很多比調用速度-objectAtIndex:通過每一次循環(huán)中。
還值得注意的是,雖然從技術上講您可以使用for-in循環(huán)逐步執(zhí)行NSEnumerator,但我發(fā)現(xiàn)這實際上使快速枚舉的所有速度優(yōu)勢無效。原因是默認NSEnumerator實現(xiàn)-countByEnumeratingWithState:objects:count:只在每次調用時在緩沖區(qū)中放置一個對象。
我在radar://6296108(NSEnumerators的快速枚舉速度緩慢)中報告了此問題,但返回結果為“不固定”。原因是快速枚舉會預取一組對象,并且如果您只想枚舉枚舉器中的給定點(例如,直到找到特定的對象或滿足條件),并在中斷后使用相同的枚舉器在循環(huán)中,通常會跳過多個對象。
如果要為OS X 10.6 / iOS 4.0及更高版本進行編碼,則還可以選擇使用基于塊的API枚舉數(shù)組和其他集合:
[array enumerateObjectsUsingBlock:^(id object, NSUInteger idx, BOOL *stop) {
// do something with object
}];
您還可以使用-enumerateObjectsWithOptions:usingBlock:和傳遞NSEnumerationConcurrent和/或NSEnumerationReverse作為options參數(shù)。
10.4或更早版本
10.5之前版本的標準習慣用法是使用NSEnumeratorwhile循環(huán),如下所示:
NSEnumerator *e = [array objectEnumerator];
id object;
while (object = [e nextObject]) {
// do something with object
}
我建議保持簡單。將自己綁定到數(shù)組類型是不靈活的,-objectAtIndex:無論如何,所謂的使用速度增加與在10.5+上進行快速枚舉所帶來的改善無關緊要。(快速枚舉實際上是在基礎數(shù)據(jù)結構上使用指針算術,并消除了大多數(shù)方法調用開銷。)過早的優(yōu)化從來都不是一個好主意-它導致混亂的代碼來解決不是您的瓶頸的問題。
使用時-objectEnumerator,您很容易更改為另一個可枚舉的集合(如NSSet,中的鍵NSDictionary等),甚至切換到-reverseObjectEnumerator向后枚舉數(shù)組,而所有其他代碼都沒有更改。如果迭代碼是一個方法,你甚至可以通過任何NSEnumerator和代碼甚至不必關心什么它的迭代。此外,NSEnumerator只要有更多對象,(至少由Apple代碼提供的)就保留它枚舉的集合,因此您不必擔心自動釋放的對象將存在多長時間。
NSEnumerator(或快速枚舉)保護您免受的最大傷害可能是在枚舉時在您不知情的情況下在您的下面進行了可變的集合(數(shù)組或其他)更改。如果按索引訪問對象,則可能會遇到奇怪的異?;虍惓ee誤(通常是在問題發(fā)生后很長時間),這很容易調試。使用一種標準習語進行枚舉具有“快速失敗”的行為,因此,當您在發(fā)生突變后嘗試訪問下一個對象時,該問題(由錯誤的代碼引起)將立即顯現(xiàn)出來。隨著程序變得更加復雜和多線程,或者甚至依賴于第三方代碼可能會修改的內容,脆弱的枚舉代碼變得越來越有問題。封裝和抽象FTW!:-)

TA貢獻1817條經驗 獲得超14個贊
對于OS X 10.4.x和更低版本:
int i;
for (i = 0; i < [myArray count]; i++) {
id myArrayElement = [myArray objectAtIndex:i];
...do something useful with myArrayElement
}
對于OS X 10.5.x(或iPhone)及更高版本:
for (id myArrayElement in myArray) {
...do something useful with myArrayElement
}
- 3 回答
- 0 關注
- 549 瀏覽
添加回答
舉報