2015-07-11 7 views
29

मुझे इस अवसर का कई अवसरों में सामना करना पड़ा है। मुझे पता है कि ऐसा क्या लगता है। लेकिन मैं वास्तव में इसकी बेहतर समझ चाहता हूं।@NSManaged क्या करता है?

मैं क्या देखा के बारे में @NSManaged - आधारित नहीं प्रलेखन पर है, लेकिन बार-बार इस्तेमाल के माध्यम से:

  1. यह जादुई कुंजी मान कोडिंग बदल देता है।
  2. यह लगभग ऑब्जेक्टिव-सी में @dynamic के बराबर (जो मैं के बारे में ज्यादा पता नहीं है)
  3. मैं इसे Parse SDK से PFObject उपवर्ग की जरूरत है। यह आमतौर पर बैकएंड से/मूल्यों को पढ़ने/लिखने के लिए केवीसी का उपयोग करता है।
  4. @NSManaged के साथ किसी भी चर को उपसर्ग करना संकलक को बंद कर देगा जब मैं प्रारंभकर्ता के भीतर प्रारंभ नहीं करता हूं।

औपचारिक परिभाषा (कोर डाटा एप्पल डॉक्स में):

कोर डाटा NSManagedObject वर्ग के उपवर्गों में अंतर्निहित भंडारण और गुण के कार्यान्वयन प्रदान करता है। अपने प्रबंधित ऑब्जेक्ट सबक्लास में प्रत्येक प्रॉपर्टी परिभाषा से पहले @NSManaged विशेषता जोड़ें जो आपके कोर डेटा मॉडल में किसी विशेषता या रिश्ते के अनुरूप है। उद्देश्य-सी में @ गतिशील विशेषता की तरह, @NSManaged विशेषता स्विफ्ट कंपाइलर को सूचित करती है कि किसी संपत्ति का संग्रहण और कार्यान्वयन रनटाइम पर प्रदान किया जाएगा। हालांकि, @ गतिशील के विपरीत, @NSManaged विशेषता केवल कोर डेटा समर्थन के लिए उपलब्ध है।

मुझे लगता है कि क्या हो गया है: @NSManaged साथ

चर कुछ के लिए संकलन समय चेकों से मुक्त किया जाएगा।

मैं औपचारिक दस्तावेज और इस मामले के बारे में विभिन्न अन्य अतः सवाल पढ़ा है:

@synthesize vs @dynamic, what are the differences?

What is common case for @dynamic usage?

मैं सहज कुछ परिदृश्यों को पहचान जहां मैं इसे इस्तेमाल करना चाहिए। मैं आंशिक रूप से जानता है कि यह क्या करता है। लेकिन जो मैं चाहता हूं वह शुद्ध समझ है कि यह क्या करता है।

आगे टिप्पणियों:

एक PFObjectParse SDK में अपने मूल्यों को एक्सेस करने के लिए Key Value Coding पर निर्भर करता है।PFObject निम्नलिखित accessors प्रदान करता है:

objectForKey:

let score = results.objectForKey("descriptionOfResult") 
//returns the descriptionOfResult value from the results object 

setObject:forKey:

results.setObject("The results for a physics exam", forKey: "descriptionOfResult") 
//sets the value of descriptionOfResult 
मेरी समझ के लिए

, @NSManagedजादुई समझता है कि चर मैं स्वचालित रूप से घोषित किया है get के लिए ऊपर accessors का उपयोग करता है और set। मैं जानना चाहता हूं कि यह कैसे करता है (अगर मैं समझता हूं कि सत्य है), और जो कुछ भी करता है।

+0

क्या आपने कभी यह पता लगाया कि आपने जो व्यवहार देखा है (आगे के अवलोकन में) कैसे हासिल किया गया था? @NSManaged सही एक्सेसर्स का उपयोग कैसे करता है? – Jason

+0

@NSManaged विशेषता केवल कोर डेटा समर्थन के लिए उपलब्ध है पूरी तरह से सही नहीं है। तुम भी CoreAnimation तेज चर है कि आप पर चेतन करना चाहते हैं के लिए इसका इस्तेमाल करने की जरूरत है: http://stackoverflow.com/questions/24150243/are-needsdisplayforkey-actionforkey-overrides-working-correctly – ambientlight

उत्तर

28

हाँ, यह थोड़े वास्तव में @dynamic तरह काम करता है - तकनीकी रूप से तो यह और भी समान हो सकता है।

@dynamic कहते हैं, 'संकलक, की जांच नहीं करते, तो मेरी गुण भी कार्यान्वित कर रहे हैं: शब्दार्थ वहाँ एक मामूली अंतर है। कोई कोड आप देख सकते हैं हो सकता है लेकिन मैं इसे रनटाइम पर काम करेंगे गारंटी '

अब @NSManaged कहते हैं,' संकलक, उन गुणों की जांच नहीं करते जैसा कि मैंने कोर डाटा कार्यान्वयन की देखभाल करने के लिए है - यह नहीं होगा क्रम '

तो

में आप कर सकते थे भी कहते हैं: @NSManaged वाक्यात्मक चीनी गतिशील की एक अधिक संकीर्ण संस्करण :)


https://github.com/KyoheiG3/DynamicBlurView/issues/2
यहाँ कोई यह है कि इस्तेमाल किया @NSManaged सीडी के बिना, क्योंकि वह चाहता था है @ गतिशील व्यवहार

+0

मैं में गहरी एक सा गोता लगाने के लिए चाहते हैं मामला - संकलक सामान्य रूप से कैसे जानता है कि संपत्ति कैसे कार्यान्वित की जाती है, और '@ एनएसएमएनेज्ड' कैसे कंपेलर को इस जिम्मेदारी को कहीं और परिभाषित करता है? क्या यह विधि को ओवरराइड करते समय 'सुपर' कॉल के समान है? क्या '@ एनएसएमएनेज्ड' कंपाइलर को बता रहा है: "सुपरक्लास से कार्यान्वयन विवरण प्राप्त करें"? –

+0

सामान्य रूप से, विधि (या संपत्ति) के लिए मशीन कोड संकलन पर संकलन पर होना चाहिए - यह कि संकलक जांच करता है। लेकिन ओबीजेसी/स्विफ्ट रनटाइम रनटाइम पर मशीन कोड जोड़ने का समर्थन करता है ... तो किसी को बस समय में कोड जोड़ना होगा :) एनएसएमएनेज्ड के साथ, कोरडाटा सिर्फ आपके लिए ही करता है।कोड superclass में नहीं है लेकिन फ्लाई –

+0

@ KelvinLau पर उत्पन्न हुआ क्या आपके पास अभी भी प्रश्न हैं? –

1

apple docs में, कस्टम प्रबंधित ऑब्जेक्ट वर्ग के लिए, वे गुण उदाहरण बोली की तरह ... enter image description here मेरे लिए यह लगता है कि कोई अंतर नहीं है, मैं उद्देश्य सी में @dynamic का इस्तेमाल किया है, ऐसा लगता है @NSManaged स्विफ्ट में प्रतिस्थापन है।

0

से ऊपर उल्लेख किया जवाब सही हैं। मेरी समझ यहाँ है।

@NSManaged इंगित करता है कि चर कुछ मान जब हम अनुप्रयोग चलाने के मिल जाएगा। कोर्डाटा स्वचालित रूप से ऐसे प्रोप के लिए गेटर और सेटर बनाता है। यह चेतावनियों के लिए संकलक को चुप करता है।

NSmanaged NSObject के उपवर्ग है। @NSManaged का मतलब है कि इन प्रोप को रनटाइम पर अतिरिक्त कोड दिया जाएगा। यह उन गुणों में किए गए परिवर्तनों को ट्रैक करता है।

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