2011-10-20 15 views
56

के समय में यह मेरी समझ है कि एक ivar सेट करने से अब ऑब्जेक्ट को असाइन किया जा रहा है, क्योंकि strong क्वालीफायर को चर सेट कर दिया गया है। चूंकि ivars ऑब्जेक्ट के दायरे में हैं जिन्हें वे घोषित कर रहे हैं और strong वेरिएबल के दायरे में ऑब्जेक्ट्स को बरकरार रखते हैं, इसका मतलब है कि इवर मूल्य कभी जारी नहीं किया जाएगा जबकि इवर युक्त ऑब्जेक्ट अभी भी जिंदा है।संपत्ति बनाम ivar एआरसी

क्या यह सही है?

यदि हां, तो क्या मैं सोच रहा हूं कि स्मृति प्रबंधन के मामले में, एक सतत (मजबूत) संपत्ति और एक साधारण ivar के बीच कोई अंतर नहीं है?

+1

अच्छा सवाल, कुछ समय पर खुद को सोच रहा था। –

उत्तर

67

एक चर हैं:

  1. एक वर्ग ARC का उपयोग करने में घोषित किया जाता है।
  2. पूरी तरह से कक्षा कार्यान्वयन के लिए उपयोग किया जाता है (कक्षा इंटरफेस के हिस्से के रूप में खुलासा नहीं किया जाता है)।
  3. किसी भी KVO की आवश्यकता नहीं है।
  4. किसी भी कस्टम गेटर/सेटर की आवश्यकता नहीं है।

तो यह एक इसी @property/@synthesize के बिना एक इवर के रूप में यह घोषणा करने के लिए, और सीधे कार्यान्वयन के भीतर यह उल्लेख करने के लिए उपयुक्त है। कक्षा कार्यान्वयन फ़ाइल में इस ivar घोषित करने के लिए यह Encapsulation के साथ इनलाइन है।

// MyClass.h 
@interface MyClass : ParentClass 
@end 

// MyClass.m 
@implementation MyClass { 
    NSString *myString; 
} 

- (void)myMethod { 
    myString = @"I'm setting my ivar directly"; 
} 
@end 
  • यह इवर एआरसी संकलक द्वारा __strong रूप में माना जाएगा।
  • इसे nil में प्रारंभ किया जाएगा यदि यह एक ऑब्जेक्ट है, या 0 यदि यह एक आदिम है।
+0

2 आइटम के बारे में सुनिश्चित नहीं हो सकता है। यू क्लास इंस्टेंस-> iVar = @ "नया मान" –

+2

@DenisMikhaylov अच्छा बिंदु का उपयोग कर सार्वजनिक ivar तक पहुंच सकता है। हालांकि मुझे लगता है कि मैं "प्वाइंट 2" में जाऊंगा क्योंकि मैं सर्वोत्तम अभ्यास के बारे में बात कर रहा हूं, और शायद कक्षा के इवरों तक पहुंचने के लिए शायद यह अच्छा अभ्यास नहीं है। – bearMountain

+0

संक्षिप्त उत्तर, धन्यवाद। –

6

आप KVO का उपयोग नहीं कर सकते हैं और एआरसी का उपयोग करते समय वे समान चर के साथ कस्टम गेटर और सेटर्स करते हैं।