मैं एक सरणी में सभी ऑब्जेक्ट्स को चयनकर्ता बनाना चाहता हूं। मैंने उचित नाम makeObjectsPerformSelector:
विधि की खोज की है, लेकिन मेरे पास इसके साथ एक प्रश्न है। अगर मैं इसे किसी सरणी पर उपयोग करता हूं, तो क्या यह मौजूदा सरणी को बदल देगा या एक नया लौटाएगा? यदि यह मौजूदा ऑब्जेक्ट को संशोधित करता है, तो चयनकर्ता के साथ एक नया सरणी वापस करने का सबसे आसान तरीका क्या है?makeObjectsPerformSelector:
उत्तर
makeObjectsPerformSelector: उस चयनकर्ता को सरणी में प्रत्येक ऑब्जेक्ट के विरुद्ध चलाने जा रहा है। यदि उन वस्तुओं को चयनकर्ता द्वारा संशोधित किया जाता है तो उन्हें संशोधित किया जाएगा। यह कुछ भी वापस नहीं करता है। अब, एक पकड़ है, जो डिफ़ॉल्ट रूप से कोको में अधिकांश प्रतियां उथले प्रतियां हैं, जिसका अर्थ है कि आपको एक नई सरणी मिलती है, लेकिन अंतर्निहित वस्तुओं को यह वही वस्तुएं होती हैं। आपको initWithArray का उपयोग करने की आवश्यकता होगी: प्रतिलिपि बनाने के लिए इसे मूल स्तर की वस्तुओं की प्रतिलिपि बनाना भी है। आप बदल वस्तुओं से युक्त एक नई सरणी के साथ-साथ पुराने सरणी चाहते हैं कुछ इस तरह करते हैं:
NSArray *newArray = [[NSArray alloc] initWithArray:oldArray copyItems:YES];
[newArray makeObjectsPerformSelector:@selector(doSomethingToObject)];
मुझे आशा है कि मैं सही ढंग से इस व्याख्या हूँ ...
आप [myArray makeObjectsPerformSelector करते हैं: कुछ चयनकर्ता], आप प्रभावी ढंग से केवल myArray के माध्यम से पुनरावृत्त कर रहे हैं और प्रत्येक ऑब्जेक्ट में चयनकर्ता संदेश भेज रहे हैं। सरणी अपरिवर्तित है क्योंकि makeObjectsPerformSelector को इसकी सामग्री बदलने की अनुमति नहीं है।
तो अंत में, आपको एक ही वस्तु के साथ एक ही सरणी मिल गई है।
हाँ। makeObjectsPerformSelector: यह लिखने के लिए बहुत शॉर्टकट है: (सरणी में आईडी ऑब्जेक्ट) { [ऑब्जेक्ट कुछ चयनकर्ता: कुछ आर्ग्यूमेंट]; } – Alex
यदि मैं इसे किसी सरणी पर उपयोग करता हूं, तो क्या यह मौजूदा सरणी को बदल देगा या एक नया लौटाएगा?
सं
पहले, हस्ताक्षर पढ़ें:
- (void)makeObjectsPerformSelector:(SEL)aSelector
void
, इसके बाद कोई सितारों के साथ, का अर्थ है "कुछ भी वापस नहीं करता है"।
दूसरा, ध्यान दें कि यह एनएसएआरएआरई का एक तरीका है, जो एक अपरिवर्तनीय वर्ग है। इसलिए, makeObjectsPerformSelector:
प्राप्तकर्ता सरणी को म्यूटेट नहीं करता है, क्योंकि यह असंभव है।
एनएसएमयूटेबलएरे है, और चूंकि यह एनएसएआरएआरई का उप-वर्ग है, इसलिए यह makeObjectsPerformSelector:
प्राप्त करता है। हालांकि, अगर एनएसएमयूटेबलएरे ने उस विधि के व्यवहार को बदल दिया है, तो इसके दस्तावेज में विधि के लिए अपनी लिस्टिंग होगी (विभिन्न वर्गों के दस्तावेज में init
की कई परिभाषाएं देखें)। ऐसी कोई सूची नहीं है, इसलिए आप सुरक्षित रूप से (और सही ढंग से) अनुमान लगा सकते हैं कि -[NSMutableArray makeObjectsPerformSelector:]
ठीक उसी तरह काम करता है जैसे -[NSArray makeObjectsPerformSelector:]
।
ऑब्जेक्ट्स आपके संदेश के जवाब में स्वयं को संशोधित कर सकते हैं, लेकिन सरणी में makeObjectsPerformSelector:
के बाद पहले ही वही ऑब्जेक्ट्स होंगे।
हाँ। मैं रूबी से उद्देश्य-सी में आ रहा हूं, इसलिए कभी-कभी मैं ऑब्जेक्ट टाइपिंग के बारे में भूल जाता हूं। मुझे पता चला कि क्या ऑब्जेक्ट्सफॉर्मफॉर्मर वास्तव में थोड़ी देर के लिए इसके बारे में सोचने के बाद करता है। – Allyn
, यदि आप चाहते एक विधि बुला के परिणाम के साथ एक नई सारिणी निर्मित करते हैं, आप यह कर सकते हैं:
NSArray *derivedArray = [originalArray valueForKey:@"foo"];
यह आपके वस्तुओं संभाल कर सकते हैं, तो केवल काम करेंगे एक '-valueForKey: @ "foo"' संदेश और जाहिर है, केवल उन विधियों के लिए उपयुक्त है जो कोई तर्क नहीं लेते हैं और एक गैर-शून्य मान वापस करते हैं।
- 1. ऑब्जेक्ट्स बनाने के लिए बूल पास करनाफॉर्मर चयनकर्ता: ऑब्जेक्ट:
- 2. सिम्युलेटर एप्लिकेशन इंस्टॉल करने में विफल
- 3. कोको एनएसएआरएआरई/एनएसएसएटी: -मेक ऑब्जेक्ट्सफॉर्मफॉर्मर: बनाम तेज गणना
- 4. UIWebView लोडिंग एचटीएमएल 5-वीडियो EXC_BAD_ACCESS क्रैश
- 5. एनएसएनंबर को बूल की अपेक्षा करने के तरीके को कैसे पास करना संभव है?
- 6. कोको में ऑब्जेक्ट फैक्ट्री के लिए एक क्लास नाम को तर्क के रूप में कैसे पास किया जा सकता है?
- 7. UITableViewCell
- 8. NSMutableAttributedString के साथ [NSTextStorage setAttributedString] क्रैश क्यों करता है?
- 9. स्क्रिप्टिंग ब्रिज
- 10. GMGridView चयन
- 11. उद्देश्य सी, थ्रेड 1 प्रोग्राम सिग्नल SIGABRT
- 12. SourceCache
चयनकर्ता '-makeObjectsPerformSelector को पास किया गया:' कोई तर्क नहीं लेता है।(यह [डॉक्स] में है (https://developer.apple.com/library/mac/#documentation/Cocoa/Reference/Foundation/Classes/NSArray_Class/NSArray.html)।) फिर भी आपका चयनकर्ता दिखाया गया है, करता है। – trudyscousin