2009-02-18 7 views
17

मैं एक सरणी में सभी ऑब्जेक्ट्स को चयनकर्ता बनाना चाहता हूं। मैंने उचित नाम makeObjectsPerformSelector: विधि की खोज की है, लेकिन मेरे पास इसके साथ एक प्रश्न है। अगर मैं इसे किसी सरणी पर उपयोग करता हूं, तो क्या यह मौजूदा सरणी को बदल देगा या एक नया लौटाएगा? यदि यह मौजूदा ऑब्जेक्ट को संशोधित करता है, तो चयनकर्ता के साथ एक नया सरणी वापस करने का सबसे आसान तरीका क्या है?makeObjectsPerformSelector:

उत्तर

29

makeObjectsPerformSelector: उस चयनकर्ता को सरणी में प्रत्येक ऑब्जेक्ट के विरुद्ध चलाने जा रहा है। यदि उन वस्तुओं को चयनकर्ता द्वारा संशोधित किया जाता है तो उन्हें संशोधित किया जाएगा। यह कुछ भी वापस नहीं करता है। अब, एक पकड़ है, जो डिफ़ॉल्ट रूप से कोको में अधिकांश प्रतियां उथले प्रतियां हैं, जिसका अर्थ है कि आपको एक नई सरणी मिलती है, लेकिन अंतर्निहित वस्तुओं को यह वही वस्तुएं होती हैं। आपको initWithArray का उपयोग करने की आवश्यकता होगी: प्रतिलिपि बनाने के लिए इसे मूल स्तर की वस्तुओं की प्रतिलिपि बनाना भी है। आप बदल वस्तुओं से युक्त एक नई सरणी के साथ-साथ पुराने सरणी चाहते हैं कुछ इस तरह करते हैं:

NSArray *newArray = [[NSArray alloc] initWithArray:oldArray copyItems:YES]; 
[newArray makeObjectsPerformSelector:@selector(doSomethingToObject)]; 
+4

चयनकर्ता '-makeObjectsPerformSelector को पास किया गया:' कोई तर्क नहीं लेता है।(यह [डॉक्स] में है (https://developer.apple.com/library/mac/#documentation/Cocoa/Reference/Foundation/Classes/NSArray_Class/NSArray.html)।) फिर भी आपका चयनकर्ता दिखाया गया है, करता है। – trudyscousin

2

मुझे आशा है कि मैं सही ढंग से इस व्याख्या हूँ ...

आप [myArray makeObjectsPerformSelector करते हैं: कुछ चयनकर्ता], आप प्रभावी ढंग से केवल myArray के माध्यम से पुनरावृत्त कर रहे हैं और प्रत्येक ऑब्जेक्ट में चयनकर्ता संदेश भेज रहे हैं। सरणी अपरिवर्तित है क्योंकि makeObjectsPerformSelector को इसकी सामग्री बदलने की अनुमति नहीं है।

तो अंत में, आपको एक ही वस्तु के साथ एक ही सरणी मिल गई है।

+2

हाँ। makeObjectsPerformSelector: यह लिखने के लिए बहुत शॉर्टकट है: (सरणी में आईडी ऑब्जेक्ट) { [ऑब्जेक्ट कुछ चयनकर्ता: कुछ आर्ग्यूमेंट]; } – Alex

15

यदि मैं इसे किसी सरणी पर उपयोग करता हूं, तो क्या यह मौजूदा सरणी को बदल देगा या एक नया लौटाएगा?

सं

पहले, हस्ताक्षर पढ़ें:

- (void)makeObjectsPerformSelector:(SEL)aSelector 

void, इसके बाद कोई सितारों के साथ, का अर्थ है "कुछ भी वापस नहीं करता है"।

दूसरा, ध्यान दें कि यह एनएसएआरएआरई का एक तरीका है, जो एक अपरिवर्तनीय वर्ग है। इसलिए, makeObjectsPerformSelector: प्राप्तकर्ता सरणी को म्यूटेट नहीं करता है, क्योंकि यह असंभव है।

एनएसएमयूटेबलएरे है, और चूंकि यह एनएसएआरएआरई का उप-वर्ग है, इसलिए यह makeObjectsPerformSelector: प्राप्त करता है। हालांकि, अगर एनएसएमयूटेबलएरे ने उस विधि के व्यवहार को बदल दिया है, तो इसके दस्तावेज में विधि के लिए अपनी लिस्टिंग होगी (विभिन्न वर्गों के दस्तावेज में init की कई परिभाषाएं देखें)। ऐसी कोई सूची नहीं है, इसलिए आप सुरक्षित रूप से (और सही ढंग से) अनुमान लगा सकते हैं कि -[NSMutableArray makeObjectsPerformSelector:] ठीक उसी तरह काम करता है जैसे -[NSArray makeObjectsPerformSelector:]

ऑब्जेक्ट्स आपके संदेश के जवाब में स्वयं को संशोधित कर सकते हैं, लेकिन सरणी में makeObjectsPerformSelector: के बाद पहले ही वही ऑब्जेक्ट्स होंगे।

+0

हाँ। मैं रूबी से उद्देश्य-सी में आ रहा हूं, इसलिए कभी-कभी मैं ऑब्जेक्ट टाइपिंग के बारे में भूल जाता हूं। मुझे पता चला कि क्या ऑब्जेक्ट्सफॉर्मफॉर्मर वास्तव में थोड़ी देर के लिए इसके बारे में सोचने के बाद करता है। – Allyn

7
अन्य उत्तर के लिए आगे

, यदि आप चाहते एक विधि बुला के परिणाम के साथ एक नई सारिणी निर्मित करते हैं, आप यह कर सकते हैं:

NSArray *derivedArray = [originalArray valueForKey:@"foo"]; 

यह आपके वस्तुओं संभाल कर सकते हैं, तो केवल काम करेंगे एक '-valueForKey: @ "foo"' संदेश और जाहिर है, केवल उन विधियों के लिए उपयुक्त है जो कोई तर्क नहीं लेते हैं और एक गैर-शून्य मान वापस करते हैं।