第七色在线视频,2021少妇久久久久久久久久,亚洲欧洲精品成人久久av18,亚洲国产精品特色大片观看完整版,孙宇晨将参加特朗普的晚宴

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

如何遍歷NSArray?

如何遍歷NSArray?

隔江千里 2019-10-04 15:31:08
我正在尋找在NSArray上進行迭代的標準用法。我的代碼必須適合OS X 10.4+。
查看完整描述

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!:-)


查看完整回答
反對 回復 2019-10-04
?
大話西游666

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

}


查看完整回答
反對 回復 2019-10-04
  • 3 回答
  • 0 關注
  • 549 瀏覽

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯(lián)系客服咨詢優(yōu)惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號