2010-07-13 11 views
11

मैं उद्देश्य-सी गुणों को समझने की कोशिश कर रहा हूं और मेरे पास उनके वाक्यविन्यास के बारे में कुछ प्रश्न हैं।संपत्ति घोषणा और स्वचालित बैकिंग संग्रहण आवंटन

क्या स्पष्ट रूप से इस तरह एक संपत्ति के लिए एक इवर घोषित करने के बीच अंतर है:

@interface myObject1 : NSObject { 
    NSString *title; 
} 
@property (copy) NSString *title; 
@end 

और इस:

@interface myObject2 : NSObject { 
} 
@property (copy) NSString *title; 
@end 

myObject2 उदाहरण काम करने के लिए लगता है। क्या myObject2 में गुणों को लागू करना ठीक है या संबंधित ivar को हमेशा स्पष्ट रूप से परिभाषित किया जाना चाहिए?

स्पष्ट रूप से ivar घोषित नहीं करने की विधियां क्या हैं?

+0

भ्रम के लिए खेद है में चर स्थिति को देखने के लिए होने अधिक कष्टप्रद है ज्यादातर 32 बिट ओएसएक्स कर रहे हैं, मुझे लगता है कि लुई ने पोस्ट किया था। –

उत्तर

13

आधुनिक उद्देश्य सी रनटाइम (nonfragile-abi) पर वे समान हैं, ivar बैकिंग स्वचालित रूप से @ सिंथेसिस घोषणा द्वारा बनाई जाएगी। यह आईफोन, और 64 बिट मैक ओएस एक्स ऐप्स द्वारा उपयोग किया जाने वाला रनटाइम है। 32 बिट मैक ओएस एक्स विरासत रनटाइम का उपयोग करता है, जहां इवर को संश्लेषित करना संभव नहीं है, और आपके द्वारा लिखे गए कोड का दूसरा बिट ठीक से संकलित नहीं होगा।

आईफोन सिम्युलेटर के नवीनतम संस्करण आधुनिक रनटाइम का उपयोग करते हैं, लेकिन पुराने लोग नहीं करते हैं। इसलिए, दोनों कोड उदाहरण वास्तव में iPhones (आवश्यक संग्रहण को संश्लेषित करने) पर काम करेंगे, दूसरा उदाहरण सिम्युलेटर के लिए संकलित करने में विफल रहेगा जब तक कि आपके पास अद्यतित एक्सकोड न हो।

+0

तो क्या बैकिंग वैरिएबल को स्पष्ट रूप से घोषित करने का कोई नकारात्मक पक्ष नहीं है (आपके द्वारा वर्णित पुराने कंपाइलर्स/सिमुलेटर के साथ असंगतता समस्याओं के अलावा)? – Avalanchis

+0

वर्तमान कंपाइलर्स के साथ, नहीं, वहां यदि आप क्लैंग के विकास के निर्माण में उपयोग कर रहे हैं और स्वचालित सिंथेसाइज़र (-ऑनफ्रैगिल-एबीआई 2) चालू करते हैं, तो चीजें थोड़ी अधिक जटिल होती हैं, लेकिन मैं उस तरह की चीजों के बारे में चिंता नहीं करता। –

+0

धन्यवाद बहुत ज्यादा। मुझे लगता है कि मेरा भ्रम मुख्य रूप से इस तथ्य के कारण था कि मुझे एहसास नहीं हुआ कि यह एक अपेक्षाकृत नई भाषा सुविधा है, इसलिए यह स्पष्ट नहीं था कि अगर आप को ऐसा करने की ज़रूरत नहीं है तो आप सरल संपत्ति के लिए ivar को स्पष्ट रूप से घोषित करना चाहते हैं। – Avalanchis

2

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

मैं क्योंकि कम लिखते का काम करने के MyObject2 तरह से उपयोग शुरू कर दिया है, लेकिन यह की वजह से, gdb कमांड लाइन में टाइप करने के लिए डिबगर :(

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