2009-01-08 16 views
17

के लिए गुणों का उपयोग मुझे उद्देश्य सी 2.0 में गुणों का उपयोग करने में समझ में आ रहा है। ऐसा लगता है कि आपको एक प्राचीन प्रकार के लिए संपत्ति की आवश्यकता नहीं है जैसे: int, bool, float। क्या ये सच है? मैंने उदाहरणों को इन प्रकारों के गुण दिखाते हुए देखा है और अन्य उन्हें बाहर छोड़ रहे हैं। उदाहरण के लिए, एप्पल के नमूना कोड में वे हैं:आदिम प्रकार

... 
@interface Book : NSObject { 
    // Primary key in the database. 
    NSInteger primaryKey; 
    // Attributes. 
    NSString *title; 
    NSDate *copyright; 
    NSString *author; 

    BOOL hydrated; 
    BOOL dirty; 
    NSData *data; 
} 

@property (assign, nonatomic, readonly) NSInteger primaryKey; 
// The remaining attributes are copied rather than retained because they are value objects. 
@property (copy, nonatomic) NSString *title; 
@property (copy, nonatomic) NSDate *copyright; 
@property (copy, nonatomic) NSString *author; 
... 

Apple SQLite Book List Sample Code

तो आप देख सकते हैं कि वे BOOL के लिए एक संपत्ति का उपयोग नहीं करते हैं, लेकिन वे इलाज यह कार्यान्वयन फ़ाइल भर एक उदाहरण चर के रूप में, मूल्य पढ़ना और मूल्य निर्धारित करना। ऑनलाइन खोजना मुझे ऐसे ट्यूटोरियल मिले हैं जो इन प्रकारों के लिए गुणों का उपयोग करते हैं जैसे: (@property BOOL flag)। क्या कोई इस विषय पर मेरे लिए कुछ प्रकाश डाल सकता है? धन्यवाद।

उत्तर

34

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

+0

धन्यवाद मार्क्स हाँ, मैं बहुत सारी चीजों के लिए गुणों का उपयोग कर रहा था और बस मेरी कक्षाओं के माध्यम से स्क्रब कर रहा था और यह सुनिश्चित कर रहा था कि यह सही था। मैंने ऐप्पल नमूना कोड का लिंक जोड़ा जो मैं अपने प्रश्न में जिक्र कर रहा हूं। लेकिन ऐसा लगता है कि वे इसे सीधे एक्सेस कर रहे हैं (self.dirty के माध्यम से नहीं जा रहे हैं) – Sean

+3

हां मैं सहमत हूं कि यदि आवश्यकता नहीं है तो प्राइमेटिव के लिए गुणों की आवश्यकता नहीं है। यदि आपको अपनी कक्षा के बाहर इसे एक्सेस करने की आवश्यकता है, तो आपको एक संपत्ति की आवश्यकता है। – mk12

+1

गुणों के लिए एक और उपयोग स्मृति प्रबंधन को सरल बनाना है। Dealloc में, आप [ivar1 रिलीज] के बजाय self.ivar1 = nil हो सकता है; ivar1 = शून्य; कोई बदलाव नहीं है, लेकिन फिर भी एक अच्छी आदत है जो स्मृति प्रबंधन बॉयलरप्लेट कोड को सरल बनाती है। Primitives को इसकी आवश्यकता नहीं है, लेकिन मैंने सोचा कि मैं समझाऊंगा कि आपकी टिप्पणी के बाद गुण कहां उपयोगी हैं। – Luke

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