2011-02-02 52 views
20

我有一個班,我希望我的班級確認NSFastEnumeration協議。我已閱讀文檔,但它並不十分清楚。有人可以告訴我協議方法應該返回什麼以及它是如何工作的?提前致謝。有誰知道如何實現NSFastEnumeration協議?

+0

[正確構建NSFastEnumeration類](http://stackoverflow.com/questions/3468349/proper-construction-of-nsfastenumeration-class) – outis 2012-07-20 05:35:00

回答

41

蘋果的FastEnumerationSample顯示你該做什麼,但這裏有一個細分。

唯一的NSFastEnumeration方法countByEnumeratingWithState:objects:count:返回集合的塊。只要需要更多的項目,它就會被執行,直到它通過返回0表示沒有更多的項目。塊將作爲C的數組傳遞給id s。

在該方法中,state參數包含您將使用的大部分(如果不是全部)數據。您需要設置state->itemsPtr並更新state->state,每次單獨調用countByEnumeratingWithState:objects:count:。下面是NSFastEnumerationState每個字段的簡短說明:

  • state:代表序列中的位置上迭代。對於索引集合,這將是索引。對於鏈接列表,這可能是一個節點指針。對於其他類型,這可能是一個更復雜的類型(例如,對於樹,state->state可能是用作存儲節點的堆棧的NSMutableArray)。當第一次調用countByEnumeratingWithState:objects:count:時,state->state爲0;檢查這個條件來初始化state結構。
  • itemsPtr:塊中的項目;指向一個C數組id s。可可將遍歷這個數組,將每個項目依次綁定到在for-in循環中命名的變量。
  • mutationsPtr:用於可變集合,用於指示自上次調用countByEnumeratingWithState:objects:count:以來集合已發生更改。通常情況下,初始化狀態時設置一次。集合增強器會增加它指向的值。可可將比較countByEnumeratingWithState:objects:count:返回的值與前一次調用的值;如果他們不同,Cocoa會拋出異常。
  • extra:您可以使用它來存儲額外的數據。

您可以將state->state和任何元素state->extra設置爲任何您想要的;他們只是爲了您的方便而提供,並不會影響可可。 state->itemsPtr,*state->mutationsPtr和該方法返回的值會影響Cocoa。

至於另外兩個方法參數,stackbuf是Cocoa提供的用於存放項目的數組。它的使用是可選的,但如果您不使用它,則必須爲state->itemPtr分配存儲空間。如果您使用它,請在每次調用時將state->itemsPtr設置爲stackbuflenstackbuf的長度,是您可以在其中存儲的項目的最大數量。

進一步閱讀:

+0

的可能的重複將down-voter照顧解釋爲什麼引用示例代碼包含文件化的實施是否值得投票? OP從未提及閱讀樣本。示例代碼的作者將更多時間放在示例中,而不是典型的SO回答。 taaaaanks – justin 2011-02-02 10:11:20