2012-02-20 11 views
28

उद्देश्य-सी में स्वचालित रूप से @ सिंथेसाइज़ स्वचालित रूप से कौन सी स्थितियों के तहत है?उद्देश्य-सी में स्वचालित रूप से @synthesize क्या स्थितियों के तहत है?

शायद एलएलवीएम 3.0 और ऊपर का उपयोग करते समय? नेट के चारों ओर पढ़ने से ऐसा लगता है कि @synthesize एक्सकोड 4 के साथ अनावश्यक है। हालांकि मैं एक्सकोड 4 का उपयोग कर रहा हूं और चेतावनी प्राप्त कर रहा हूं जब मैं @synthesize कोई संपत्ति नहीं करता हूं।

Why don't properties get automatically synthesized पर कुछ प्रतिक्रियाओं का अर्थ है कि कुछ परिस्थितियों में कुछ बिंदु पर @ सिंथेसाइज को छोड़ा जा सकता है।

Another (old) reference संकेत है कि @synthesize भविष्य में किसी बिंदु पर स्वचालित हो सकता है।

+5

क्या आपके पास एक लिंक है जहां @ सिंथेसिस को अनावश्यक के रूप में वर्णित किया गया है? – bneely

+0

शायद उन्होंने वर्तमान में अंडर-एनडीए एक्सकोड 4.4 के बारे में कुछ जानकारी देखी है और संस्करण संख्याओं के बारे में उलझन में आ गया है। –

+1

@bneely एक लिंक जोड़ा। शायद मैं गलत पढ़ रहा हूं "@ सिंथेसाइज एलएलवीएम 2.0 कंपाइलर के नवीनतम संस्करणों में स्वचालित है"। – SundayMonday

उत्तर

11

एक्सकोड 4.4 के रूप में, यदि आप किसी संपत्ति के लिए @synthesize या @dynamic नहीं लिखते हैं। कंपाइलर कार्य करता है जैसे आपने @synthesize property = _property लिखा था।

एक्सकोड 4.4 से पहले, आपको प्रत्येक संपत्ति के लिए निम्न में से एक कार्य करना होगा या अन्यथा संकलक चेतावनी जारी करेगा और आपको रनटाइम त्रुटि मिलेगी। एक्सकोड 4.4 या बाद में, आप संकलक को स्वचालित रूप से संपत्ति एक्सेसर्स और इंस्टेंस चर को संश्लेषित करने की बजाय निम्न में से कोई भी कार्य कर सकते हैं।

  1. @synthesize निर्देश का उपयोग करें।
  2. @dynamic निर्देश का उपयोग करें और किसी भी तरह से रनटाइम पर संपत्ति गेटटर और (यदि आवश्यक हो) सेटटर प्रदान करें।
  3. संपत्ति गेटटर विधि स्पष्ट रूप से लिखें और, यदि संपत्ति readwrite है, तो संपत्ति सेटर विधि।

ध्यान दें कि आप @synthesize निर्देश (या @dynamic निर्देश) और उपयोग कर सकते हैं भी स्पष्ट रूप से गेटर और/या सेटर तरीकों प्रदान करते हैं। लेकिन @synthesize उन्हें प्रदान करता है यदि आप उन्हें छोड़ देते हैं।

+2

यदि आप दोनों गेटटर और सेटर प्रदान करते हैं, तो आप स्वचालित ivar खो देते हैं, है ना? –

23

क्लैंग 3.2 (लगभग फरवरी 2012) के अनुसार, उद्देश्य-सी गुणों के "डिफ़ॉल्ट संश्लेषण" (या "ऑटो प्रॉपर्टी संश्लेषण") डिफ़ॉल्ट रूप से प्रदान किया जाता है। यह अनिवार्य रूप से ब्लॉग पोस्ट में वर्णित है जैसा कि आप मूल रूप से पढ़ते हैं: http://www.mcubedsw.com/blog/index.php/site/comments/new_objective-c_features/ (सिवाय इसके कि उस सुविधा को "सक्षम, फिर अक्षम" के रूप में वर्णित किया गया है; मुझे नहीं पता कि यह एक्सकोड के साथ कोई समस्या है या यदि क्लैंग डेवलपर्स स्वयं वापस चले गए हैं और सवाल पर आगे)।

जहां तक ​​मुझे पता है, एकमात्र मामला जिसमें संपत्ति क्लैंग 3.2 में डिफ़ॉल्ट-संश्लेषित नहीं होनी चाहिए, जब उन गुणों को प्रोटोकॉल से विरासत में मिला है। यहाँ एक उदाहरण है:

#import <Foundation/Foundation.h> 

@protocol P 
@property int finicky; 
@end 

@interface A : NSObject <P> 
@property int easygoing; 
@end 

@implementation A 
@end 

int main() { A *a = [A new]; a.easygoing = 0; a.finicky = 1; } 

आप इस उदाहरण संकलन हैं, तो आप एक चेतावनी मिल जाएगा:

test.m:11:17: warning: auto property synthesis will not synthesize property 
     declared in a protocol [-Wobjc-protocol-property-synthesis] 
@implementation A 
       ^
test.m:4:15: note: property declared here 
@property int finicky; 
      ^
1 warning generated. 

और यदि आप इसे चलाने के लिए, आप क्रम से एक त्रुटि मिल जाएगा:

objc[45820]: A: Does not recognize selector forward:: (while forwarding setFinicky:) 
Illegal instruction: 4 
4

आप बाईं ओर प्रोजेक्ट नेविगेटर में प्रोजेक्ट नाम पर क्लिक करके संश्लेषण चेतावनियां बंद कर सकते हैं, फिर बिल्ड सेटिंग्स में सभी कोबिनेड पर क्लिक करें और फिर संश्लेषण की खोज करें। इसे नंबर पर सेट किया जाना चाहिए

+0

असल में यह एकमात्र सही उत्तर है, एक पुराना जवाब है। बाकी गहरे हो जाते हैं। यदि आपके पास एकाधिक – doozMen

12

New Features in Xcode 4.4 दस्तावेज़ से:

ऑब्जेक्टिव-सी @properties डिफ़ॉल्ट रूप से संश्लेषित कर रहे हैं जब स्पष्ट रूप से लागू नहीं किया।

तो @ सिंथेसाइज डिफ़ॉल्ट रूप से एलएलवीएम 4.0 कंपाइलर के साथ एक्सकोड 4.4 से शुरू होने पर स्वचालित है।

+3

हैं तो अपने सभी लक्ष्यों की सेटिंग्स को जांचना सुनिश्चित करें कि 32-बिट मैक ओएस एक्स के लिए स्वचालित संश्लेषण समर्थित नहीं है। – ThomasW

7

इसके अलावा, यदि आपने सेटटर और गेटर मैन्युअल रूप से कार्यान्वित किया है तो संश्लेषण स्वचालित नहीं होगा। इसलिए यदि आप सोचते हैं कि आप _someVariable तक क्यों नहीं पहुंच सकते हैं, तो @property घोषित किया जा रहा है (...) कुछ टाइप कुछ उपलब्ध है, तो ऐसा इसलिए है क्योंकि आपने सेट को लागू किया है: कुछ उपलब्ध तरीकों।

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