ये कोको सरणी वस्तुएं (एनएसएआरएआरई के उदाहरण) हैं, सी सरणी या सी ++ वैक्टर नहीं, और याद रखें कि उद्देश्य-सी में ऑपरेटर ओवरलोडिंग नहीं है। किसी ऑब्जेक्ट के साथ आप केवल एक ही चीज कर सकते हैं, इसे चारों ओर पास कर सकते हैं, इसे चर में स्टोर कर सकते हैं, और इसे संदेश भेज सकते हैं।
तो सरणी-सबस्क्रिप्ट ऑपरेटर उद्देश्य-सी ऑब्जेक्ट्स के साथ गलत है। मुझे नहीं लगता कि यह ऑब्जेक्टिव-सी ऑब्जेक्ट को पॉइंटर को डिफरेंस करने के लिए भी भाषाई रूप से मान्य है, इसलिए यह कोड आपको एक कंपाइलर त्रुटि दे रहा है। हालांकि, मैं गलत हो सकता है। यदि यह रनटाइम पर बनाता है, तो वह कोड जल्द या बाद में क्रैश हो जाएगा, क्योंकि आप सरणी ऑब्जेक्ट्स के सिरों से परे स्मृति तक पहुंच रहे हैं।
(वर्ष 2013 से संपादित करें: ऑब्जेक्टिव-सी अब वस्तुओं के subscripting का समर्थन करता है अंततः यह उचित objectAtIndex:
या replaceObjectAtIndex:withObject:
संदेश में तब्दील हो तो, सवाल में कोड वास्तव में अब, काम करेगा हालांकि यह अभी भी उचित तरीके से नहीं है।। बस एक सरणी चलने के लिए, दो सरणी की तुलना करने के लिए बहुत कम।
[myArray objectAtIndex:i]
उचित तरीके से करने के लिए:)
उचित तरीके से अपने सूचकांक से एक NSArray वस्तु से एक वस्तु पुनः प्राप्त करने के सरणी-सबस्क्रिप्ट ऑपरेटर का उपयोग करने के लिए नहीं है, लेकिन सरणी objectAtIndex:
संदेश आपत्ति भेजने के लिए है किसी सरणी ऑब्जेक्ट के तत्वों पर पुनरावृत्ति करें, मान लीजिए कि आपको वास्तव में किसी अन्य चीज़ के लिए इंडेक्स की आवश्यकता नहीं है (जैसे कि एक म्यूटेबल सरणी में ऑब्जेक्ट्स को प्रतिस्थापित करना), इसे सीधे लूप करना है (इसे "तेज़ गणना" कहा जाता है):
for (MyObject *myObject in myArray) {
…
}
एनएसएआरएआरई भी प्रतिक्रिया एस objectEnumerator
और reverseObjectEnumerator
, जो एक समान-पुनरावृत्त वस्तु को वापस कर देता है। दो में से, reverseObjectEnumerator
नए कोड में अधिक उपयोगी है, क्योंकि आप सरणी पर सीधे फिर से आगे बढ़ने के लिए पुन: सक्रिय कर सकते हैं। तेजी से गणना होने से पहले उनमें से दोनों सबसे उपयोगी थे; कि कोड इस तरह देखा:
NSEnumerator *myArrayEnum = [myArray objectEnumerator];
MyObject *myObject;
while ((myObject = [myArrayEnum nextObject])) {
…
}
(हाँ, उस स्थिति में एक काम है जानबूझकर, इसलिए अतिरिक्त ()
हम निर्भीकता कोडित वापस तो, हम ऐसा नहीं किया।।?)
तुम क्या के लिए ' फिर से कर रही है, हालांकि, आप अधिक होने की संभावना सरणियों में से एक एक isEqualToArray:
संदेश भेजने के लिए, चाहते हैं के रूप में Williham Totland सुझाव:
BOOL theyAreEqual = [myFirstArray isEqualToArray:mySecondArray];
यह सुनिश्चित करें कि दोनों सरणियों, एक ही लंबाई है तो उन दोनों को लॉक-कदम में चलना कर देगा , isEqual:
को भेजना वस्तुओं की प्रत्येक जोड़ी। यह YES
वापस करेगा यदि प्रत्येक isEqual:
संदेश YES
लौटा दिया गया है; अन्यथा NO
। सरणी में अलग-अलग वस्तुएं हो सकती हैं, लेकिन जब तक प्रत्येक जोड़ी बराबर होती है, तब तक सरणी बराबर होती है।
मानता है कि आप ऑब्जेक्ट समानता चाहते हैं। यदि आप इसे isEqual:
संदेश भेजते हैं और दूसरी ऑब्जेक्ट पास करते हैं तो उनमें से एक YES
के साथ प्रतिक्रिया करता है, तो दो अलग-अलग ऑब्जेक्ट बराबर होते हैं। आप वस्तुओं की पहचान की तुलना करने के लिए होती है, तो आप लॉक-कदम पाश अपने आप को क्या करना चाहिए और ==
का उपयोग करें:
BOOL arraysContainTheSameObjects = YES;
NSEnumerator *otherEnum = [otherArray objectEnumerator];
for (MyObject *myObject in myArray) {
if (myObject != [otherEnum nextObject]) {
//We have found a pair of two different objects.
arraysContainTheSameObjects = NO;
break;
}
}
लेकिन उस संभावना नहीं है। ज्यादातर समय, मैं वस्तुओं की समानता का परीक्षण करना चाहता हूं, पहचान नहीं, इसलिए isEqualToArray:
जो मैं चाहता था।
+1 किसी व्यक्ति को मछली को पढ़ाने के लिए +1। – willc2
यादृच्छिक अनुवर्ती प्रश्न: '[nsArrrayInstance isEqual: अन्यInstance]' 'के बराबर है [nsArrrayInstance isEqualToArray: अन्यInstance]'? – nmr
@ एनएमआर: लगभग। दो एज-केस अंतर हैं: http://developer.apple.com/library/mac/documentation/Cocoa/Conceptual/CodingGuidelines/Articles/FrameworkImpl.html#//apple_ref/doc/uid/20001286-1007347 http://developer.apple।कॉम/लाइब्रेरी/मैक/प्रलेखन/कोको/अवधारणात्मक/कोकोफंडैमेंटल/कोको ऑब्जेक्ट्स/कोकोऑब्जेक्ट्स.html # // apple_ref/डॉक्टर/यूआईडी/टीपी 40002974-सीएच 4-एसड 61 –