2012-08-01 10 views
8

मैं उद्देश्य-सी और एक्सकोड के लिए नया हूं, लेकिन मुझे यह देखकर खुशी हुई कि एक्सकोड 4.4 स्वचालित रूप से मेरे लिए मेरे गुणों को संश्लेषित करता है। मुझे लगता है कि इसका मतलब है कि मुझे अब मेरे गुणों के लिए @ सिंथेसाइज टाइप करना होगा, और उदाहरण के लिए,का उपयोग करके उन्हें एक्सेस करना होगा।स्वचालित संपत्ति xcode 4.4 कार्य में कैसे संश्लेषित करती है?

मैं कुछ उदाहरण कोड फिर से लिखने की कोशिश कर रहा हूं ताकि मैं इसे बेहतर समझ सकूं, लेकिन यह कोड एक कस्टम गेटर विधि लागू करता है। उदाहरण कोड में, संपत्ति मैन्युअल रूप से संश्लेषित की जाती है, @synthesize managedObjectContext = __managedObjectContext; के रूप में। कस्टम गेटर इस तरह दिखता है:

- (NSManagedObjectContext *)managedObjectContext { 
    if (__managedObjectContext != nil) { 
     return __managedObjectContext; 
    } 

    NSPersistentStoreCoordinator *coordinator = [self persistentStoreCoordinator]; 
    if (coordinator != nil) { 
     __managedObjectContext = [[NSManagedObjectContext alloc] initWithConcurrencyType:NSMainQueueConcurrencyType]; 
     [__managedObjectContext setPersistentStoreCoordinator:coordinator]; 
    } 

    return __managedObjectContext; 
} 

इस व्यक्ति के कोड में, मैं वह बस अपना मैन्युअल संश्लेषित एक्सेसर उपयोग कर रहा है दोनों हो और स्थापित करने के लिए देखते हैं। मैंने अपने कोड में पाया, मैं __managedObjectContext को self.managedObjectContext के साथ प्रतिस्थापित कर सकता था, लेकिन नहीं। अगर मैं ऐसा करता हूं, तो मुझे यह बताते हुए एक त्रुटि मिलती है कि मैं readonly संपत्ति को असाइन करने का प्रयास कर रहा हूं। यह समझ में आता है, क्योंकि इस संपत्ति को इस अन्य कोडर द्वारा, केवल पढ़ने के रूप में परिभाषित किया गया है।

@property (readonly, strong, nonatomic) NSManagedObjectContext *managedObjectContext; 

तो, मैं कैसे वह मैन्युअल उसकी संपत्ति synthesizing के बारे में कुछ मतलब है कि अगर वह उस निर्दिष्ट सेटर का उपयोग करता है, उसे एक केवल पढ़ने के लिए संपत्ति किसी भी तरह स्थापित करने के लिए अनुमति देता है आंकड़ा।

यदि मैं मैन्युअल रूप से संपत्ति को संश्लेषित करता हूं, जैसे कोड मैं संदर्भित कर रहा हूं, तो सब कुछ काम करने के लिए वापस चला जाता है, लेकिन यह नए स्वचालित संश्लेषण का उपयोग नहीं कर रहा है। अगर मैं readonly हटा देता हूं, तो मैं इस संपत्ति को अपेक्षित के रूप में सेट कर सकता हूं, लेकिन मुझे लगता है कि मुझे समझ में नहीं आ रहा है कि उसे इसे पढ़ने के लिए क्यों है, इसलिए मैं शर्त लगाता हूं कि मैं वहां कुछ तोड़ रहा हूं।

तो, क्या मैं नए स्वचालित संश्लेषण का गलत उपयोग कर रहा हूं? अगर मैं पाठक के कारण स्वचालित संश्लेषण इसे मेरे लिए नहीं बना रहा हूं, तो मैं इसे सेटटर का उपयोग करके कैसे सेट करूं?

आप

+0

वह सीधे ivar तक पहुंचता है। एक "_" – Pochi

उत्तर

10

तो धन्यवाद XCode ऑटो संश्लेषण करती है, यह निम्न simulates जब ...

@synthesize foo = _foo; 

, आप self.foo या object.foo के साथ उचित डेटा का उपयोग कर सकते हैं।

हालांकि, एक्सेसर विधियों (और प्रारंभकर्ताओं और डेलोक) के कार्यान्वयन में, आपको सीधे iVar का उपयोग करना चाहिए।

नोट, उन iVars के दो अंडरस्कोर हैं। और, वे एक्सेसर विधि में छेड़छाड़ की जा रही हैं। _managedObjectContext का उपयोग करें, और आपको जाने के लिए अच्छा होना चाहिए।

+0

दो अंडरस्कोर हटाएं? मुझे एक जैसा दिखता है। – oliland

+2

हां, ओपी प्रश्न में आईवरों में दो अंडरस्कोर (__managedObjectContext) हैं जबकि ऑटो-संश्लेषण का उपयोग करता है। –

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