2008-08-29 9 views
12

में डॉट नोटेशन बनाम विधि कॉल के बीच प्रदर्शन अंतर आप उद्देश्य-सी में किसी ऑब्जेक्ट की किसी प्रॉपर्टी तक पहुंचने के लिए ऑब्जेक्टिव-सी में एक मानक डॉट नोटेशन या विधि कॉल का उपयोग कर सकते हैं।उद्देश्य-सी

myObject.property = YES; 

या

[myObject setProperty:YES]; 

वहाँ प्रदर्शन में एक फर्क (प्रॉपर्टी एक्सेस के संदर्भ में) है? क्या यह कोडिंग शैली के मामले में वरीयता का मामला है?

उत्तर

19

उद्देश्य-सी में संपत्ति पहुंच के लिए डॉट नोटेशन एक संदेश भेजता है, जैसे ब्रैकेट नोटेशन। यही है, यह दिया गया:

@interface Foo : NSObject 
@property BOOL bar; 
@end 

Foo *foo = [[Foo alloc] init]; 
foo.bar = YES; 
[foo setBar:YES]; 

अंतिम दो पंक्तियां बिल्कुल संकलित होंगी। एकमात्र चीज जो इसे बदलती है वह यह है कि यदि किसी संपत्ति में getter और/या setter विशेषता निर्दिष्ट है;

@interface MyView : NSView 
@property(getter=isEmpty) BOOL empty; 
@end 

if ([someView isEmpty]) { /* ... */ } 
if (someView.empty) { /* ... */ } 
अंतिम दो पंक्तियों के

दोनों हूबहू संकलन होगा: हालांकि, सभी ऐसा होता है क्या संदेश भेजा जाता है, नहीं एक संदेश भेजा है कि क्या बदल रहा है।

0

जहां तक ​​मैंने देखा है, दोनों के बीच महत्वपूर्ण प्रदर्शन अंतर नहीं है। मैं निश्चित रूप से निश्चित हूं कि ज्यादातर मामलों में इसे उसी कोड पर 'संकलित' किया जाएगा।

यदि आप सुनिश्चित नहीं हैं, तो एक परीक्षण अनुप्रयोग लिखने का प्रयास करें जो प्रत्येक विधि को दस लाख या उससे अधिक समय तक करता है, हर समय कितना समय लगता है। यह निश्चित होने का एकमात्र तरीका है (हालांकि यह विभिन्न वास्तुकला पर भिन्न हो सकता है।)

4

article from Cocoa is My Girlfriend देखें। इसका अर्थ यह है कि दूसरे पर एक का उपयोग करने का कोई प्रदर्शन दंड नहीं है।

हालांकि, नोटेशन यह देखने में और अधिक कठिन बनाता है कि आपके चर के साथ क्या हो रहा है और आपके चर क्या हैं।

4

एक बार जब आप एक प्रदर्शन अंतर देखेंगे तो एक बार आप एक संपत्ति को "nonatomic" के रूप में चिह्नित नहीं करते हैं। फिर @ सिंथेसाइज स्वचालित रूप से आपकी संपत्ति की सेटिंग के आसपास सिंक्रनाइज़ेशन कोड जोड़ देगा, इसे थ्रेड सुरक्षित रखेगा - लेकिन सेट करने और एक्सेस करने के लिए धीमा।

इस प्रकार ज्यादातर आप शायद की तरह एक संपत्ति को परिभाषित करना चाहते:

@property (nonatomic, को बनाए रखने) NSString * myProp;

व्यक्तिगत रूप से मुझे डॉट नोटेशन आम तौर पर आपके दृष्टिकोण से उपयोगी लगता है जो सही सेटटर विधियों को लिखने के बारे में सोचने के बारे में नहीं सोचता है, जो नॉनटॉमिक सेटर्स के लिए भी पूरी तरह से तुच्छ नहीं है क्योंकि आपको पुराने मूल्य को ठीक से रिलीज़ करना भी याद रखना चाहिए। टेम्पलेट कोड का उपयोग करने में मदद मिलती है लेकिन आप हमेशा गलतियां कर सकते हैं और यह आम तौर पर दोहराव कोड है जो वर्गों को अव्यवस्थित करता है।

इस बारे में जागरूक होने के लिए एक पैटर्न: यदि आप स्वयं को सेटर परिभाषित करते हैं (इसके बजाय @ सिंथेसाइज इसे बनाने की बजाय) और मूल्य निर्धारित करने के अन्य दुष्प्रभावों को शुरू करना चाहते हैं तो आपको संभवतः सेटटर को सामान्य विधि को कॉल करने के बजाय कॉल करना चाहिए संपत्ति नोटेशन।

अर्थात् गुणों का उपयोग करके कॉलर को वास्तविक मूल्य तक प्रत्यक्ष पहुंच दिखाई देती है और इससे भिन्न होता है जो किसी भी संदेश को भेजकर किया जाता है, किसी संपत्ति को एक्सेस नहीं कर सकता है (भले ही वे वास्तव में संदेश भेज रहे हों)।

0

भी प्यार के साथ कोको पर इस ब्लॉग पोस्ट पढ़ें:

http://cocoawithlove.com/2008/06/speed-test-nsmanagedobject-objc-20.html

वहाँ लेखक NSManagedObject के लिए कस्टम एक्सेसर और डॉट अंकन की गति की तुलना करके कोई फर्क नहीं पाता है। हालांकि, केवीसी एक्सेस (setValue: forKey :) लगभग दोगुनी धीमी प्रतीत होती है।