2012-12-15 4 views
11

यही है। क्यों कोई भी (कम से कम एक सार्वजनिक एपीआई के रूप में) एक विधि चाहते हैं? क्या इसके लिए कोई व्यावहारिक उपयोग है?एनएसओब्जेक्ट-अनुरूप वर्गों में स्वयं की विधि का उद्देश्य क्या है?

+0

अच्छा, क्यों नहीं ...? –

+1

सवाल था "कोई भी क्यों चाहता है ..." या "उद्देश्य क्या है ...", नहीं "यह क्यों है?" – Matoe

+1

यह एक वैध प्रश्न की तरह लगता है। डाउनवॉट्स क्यों? –

उत्तर

12

self विधि कुंजी-मूल्य कोडिंग (केवीसी) के लिए उपयोगी है।

केवीसी के साथ, आप एक वस्तु को कुछ हद तक एक शब्दकोश के साथ इलाज कर सकते हैं। आप संपत्ति के नाम वाले स्ट्रिंग का उपयोग करके ऑब्जेक्ट की किसी प्रॉपर्टी तक पहुंच सकते हैं, जैसे: [view valueForKey:@"superview"]। आप एक महत्वपूर्ण पथ युक्त स्ट्रिंग का उपयोग करके गुणों की एक श्रृंखला को नीचे चलाते हैं, जैसे: [view valueForKeyPath:@"superview.superview.center"]

NSObject के बाद self विधि है, तो आप self का उपयोग कुंजी या मुख्य पथ के रूप में कर सकते हैं: [view valueForKey:@"self"]। इसलिए यदि आप अपने कुंजी पथ को प्रोग्रामेटिक रूप से बना रहे हैं, या उन्हें फ़ाइल से पढ़ रहे हैं, तो "self" का उपयोग करके एक कुंजी के रूप में आपको एक विशेष केस लिखने से बचने की अनुमति मिल सकती है।

आप भी इस तरह विधेय में self उपयोग कर सकते हैं,:

NSPredicate *predicate = [NSPredicate predicateWithFormat:@"self beginswith \"foo\""]; 
NSArray *filteredArray = [arrayOfStrings filteredArrayWithPredicate:predicate]; 

मैं NSPredicate वास्तव में इस मामले में self विधि (KVC के माध्यम से शायद) का उपयोग करता है कि क्या पता नहीं है। यह निश्चित रूप से संभव है।

+1

"एसईएलएफ" को एनएसपीडिकेटिक्स में विशेष स्थिरता के रूप में दस्तावेज किया गया है, जैसे "शून्य", "न्यूल" और दूसरों का समूह। इसे वास्तविक "स्वयं" विधि में मैप किया जा सकता है, लेकिन मेरे लिए प्रलेखन का तात्पर्य है कि यह विशेष है। –

-1

मुझे लगता है कि यह ओबीजेसी रनटाइम के साथ करना है।

objc_msgSend(autoreleasePool, sel_registerName("drain")); 
BOOL AppDel_didFinishLaunching(struct AppDel *self, SEL _cmd, void *application, void *options) 

पहला तर्क स्वयं है। मुझे लगता है कि इसके साथ कुछ करने के लिए है। सभी ईमानदारी में हालांकि यह समाप्त हो जाएगा:

id self(struct id *self, SEL _cmd) { 
    return self; 
} 

.... इस प्रतिक्रिया को लिखने से पहले इसे और अधिक समझ में आया।

2

मुझे यकीन नहीं है कि क्यों "स्वयं" मूल रूप से जोड़ा गया था, लेकिन एक चीज जो काम में आई थी, वह इंटीरियर पॉइंटर्स को ऑब्जेक्ट्स की रक्षा कर रही थी। इंटीरियर की आधिकारिक सिफारिश इंटीरियर पॉइंटर के साथ किए जाने के बाद एक [foo self] कॉल डालना था; विधि कॉल कुछ भी कार्यात्मक रूप से नहीं करता है लेकिन यह सुनिश्चित करता है कि संकलक तब तक फू को रखता है।

संबंधित मुद्दे