2012-07-03 13 views
7

क्या हम अपने सभी इंस्टेंस वेरिएबल्स को कन्वर्ट करना चाहते हैं जिन्हें हम निजी संपत्तियों में रखना चाहते हैं या क्या मुझे कुछ याद आ रही है?उद्देश्य सी एआरसी और इंस्टेंस वैरिएबल आईओएस एसडीके

@interface SomethingElse : Something { 

    NSMutableArray *someArray; 

} 

इस उदाहरण में, someArray [NSMutableArray initWithObject: someObject] के साथ एक विधि में आरंभ नहीं हो जाता है, लेकिन नहीं बनी रहती है।

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

उत्तर

1

एआरसी का retain का संस्करण strong कहा जाता है।

मूल रूप से, आप इसे की तरह कुछ का उपयोग कर घोषणा करेंगे:

@property (strong) NSMutableArray *someArray; 

जानकारी के लिए What does the "strong" keyword do देखें।

स्थानीय चर के बजाय गुणों का उपयोग करना आम तौर पर बेहतर होता है, क्योंकि गुण आपको "मुक्त" के लिए एक्सेसर्स/सेटर्स प्राप्त करते हैं, और आमतौर पर उपयोग करना आसान होता है।

+0

धन्यवाद, और मैं समझता हूं कि एआरसी गुणों के साथ कैसे काम करता है, लेकिन मेरा प्रश्न वास्तव में यह निर्धारित करना है कि अब स्थानीय चर को निजी गुणों के साथ बदला जाना चाहिए (अगर हम उन्हें बनाए रखना चाहते हैं)? –

+0

@ बिलकर्वस्की: आम तौर पर, हाँ। संपादित करें – houbysoft

+0

ऐप्पल आपको अनुशंसा करता है कि जब तक आपको आवश्यकता न हो, तब तक वे स्पष्ट रूप से चर घोषित नहीं करेंगे। गुणों का उपयोग करें, और, यदि आपको iVar तक सीधे पहुंच की आवश्यकता है, तो आप संपत्ति को संश्लेषित करते समय ivar नाम सेट कर सकते हैं, उदाहरण के लिए: @synthesize myProperty = __myVariable – isaac

0

ओबीजे-सी 2.0 के साथ और बाद में, वास्तव में iVars का उपयोग करने के लिए बहुत कम कारण प्रतीत होता है। मैंने व्यक्तिगत रूप से हमेशा के लिए एक का उपयोग नहीं किया है। गुण सिर्फ आपके लिए सबकुछ करते हैं!

+0

iVars का उपयोग करने के कई कारण हैं। सूची में सबसे ऊपर: एक हैकर के साथ रनटाइम पर एक डाइलीब के साथ आने और आपके कोड को गड़बड़ करने के लिए बहुत कठिन, सी-स्टाइल सरणी के लिए अनुमति देता है, और एक संपत्ति से हल्का वजन होता है। –

+0

@ रिचर्ड जे। RossIII: iVars सुरक्षा के संबंध में: क्या यह आईओएस सैंडबॉक्स पर्यावरण पर लागू होता है? – user523234

+0

@ user523234 yup। जेलब्रोकन डिवाइस वाला कोई भी व्यक्ति आपके निष्पादन योग्य पर कोड निष्पादित कर सकता है जिसे आप नहीं करना चाहते हैं, और गुणों के बजाय iVars का उपयोग करते समय निष्पादित करना बहुत कठिन है। –

15

क्या हम उन सभी स्थानीय चरों को परिवर्तित करना चाहते हैं जिन्हें हम निजी संपत्तियों में रखना चाहते हैं या क्या मुझे कुछ याद आ रही है?

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

दूसरा, नहीं, आपको अपने सभी इंस्टेंस चर को गुणों में परिवर्तित करने की आवश्यकता नहीं है। Instance variables are treated as strong references by default under ARC. एक संपत्ति वास्तव में केवल एक वादा है कि एक वर्ग कुछ अर्थशास्त्र के साथ कुछ एक्सेसर्स प्रदान करता है। बस एक आवृत्ति चर होने का मतलब यह नहीं है कि आपको उस ivar के लिए एक्सेसर्स प्रदान करना होगा। (कुछ लोग कह सकते हैं कि होना चाहिए, लेकिन आपको यह नहीं करना चाहिए।)

+0

धन्यवाद, उदाहरण चर को सही ढंग से प्रतिबिंबित करने के लिए संपादित प्रश्न। मैंने उस उदाहरण चर को मजबूत करने के लिए डिफ़ॉल्ट पढ़ा है, लेकिन मेरे उदाहरण में ऑब्जेक्ट को संदर्भित किया जा रहा है (यानी, BAD_ACCESS), जो मुझे इसे पोस्ट करने के लिए प्रेरित करता है क्योंकि अब मैं उलझन में हूं। –

3

ए @ प्रोपर्टी एक आवृत्ति चर के समान है जब तक आप डिफ़ॉल्ट स्टोरेज संशोधक के अलावा अन्य का उपयोग नहीं करते हैं, जो ऑब्जेक्ट्स के लिए मजबूत है। उदाहरण, यदि आप @property (copy) NSString *s; चाहते हैं तो या तो एक आवृत्ति चर का उपयोग करें और प्रत्येक बार जब आप चर सेट करते हैं, तो कॉपी कॉपी करना याद रखें, या @property (जो आसान है) का उपयोग करें।

+0

यह वास्तव में एकमात्र स्थिति है कि '@ property' का उपयोग करके एक निजी चर की भावना होती है, क्योंकि' @ property' का कोई भी उपयोग पहले से ही एक चर बनाता है। +1। –

+0

सी/स्थानीय/उदाहरण/ –

1

आप अपनी कुछ अन्य टिप्पणियों में एक BAD_ACCESS समस्या का वर्णन करते हैं। यहां कुछ और चल रहा है। एआरसी में, आपके इवर्स तब तक मजबूत होते हैं जब तक कि अन्यथा योग्य नहीं हो (और गैर-एआरसी में, वे आपकी तरफ से रिहा नहीं होने जा रहे हैं)।

उदाहरण के लिए, इस एआरसी कोड ठीक काम करता है, कोई BAD_ACCESS साथ के रूप में आप अन्य उत्तर देने के लिए अपनी टिप्पणी में रिपोर्ट:

@interface ArcTestViewController() 
{ 
    NSMutableArray *_someArray; 
} 
@end 

@implementation ArcTestViewController 

- (void)dealloc 
{ 
    _someArray = nil; 
} 

- (void)viewDidLoad 
{ 
    [super viewDidLoad]; 

    _someArray = [[NSMutableArray alloc] initWithObjects:@"Mo", @"Larry", @"Curly", nil]; 
} 

- (IBAction)checkIvarTouchUpInside:(id)sender 
{ 
    NSLog(@"%s _someArray = %@", __FUNCTION__, _someArray); 
} 

@end 

आप हमें अपने उदाहरण है जहाँ आप अपने BAD_ACCESS क्योंकि यह हो रही है दिखाने के लिए हो सकता है कुछ और होना है।

"संपत्ति" या "ivar" प्रश्न के उत्तर में, जबकि मैं "हमेशा उपयोग गुणों" तर्क के प्रति सहानुभूतिशील हूं, व्यक्तिगत रूप से मैं उन चीज़ों के लिए गुणों का उपयोग करता हूं जिनके लिए मुझे बाहरी एक्सेसर्स प्रदान करने की आवश्यकता है और मैं अन्यथा निजी का उपयोग करता हूं ivars (.h में नहीं, बल्कि .m फ़ाइल में निजी इंटरफ़ेस में)। यह मेरी सार्वजनिक इंटरफेस को मेरी .h फ़ाइलों में वास्तव में साफ और समझने में आसान बनाता है जब मैं महीनों बाद उनके पास वापस आ जाता हूं। यदि आप "हमेशा उपयोग गुणों" दृष्टिकोण को अपनाते हैं, तो मैं केवल सलाह दूंगा कि उन संपत्तियों की आपकी सार्वजनिक घोषणा यथासंभव सीमित होनी चाहिए (अगर आप कर सकते हैं तो संपत्ति को निजी बनाएं, यदि आप डॉन करते हैं तो संपत्ति की सार्वजनिक घोषणा को पढ़ें रीडराइट एक्सेस, आदि प्रदान करने की आवश्यकता नहीं है)।

वैसे, कोको के लिए कोडिंग दिशानिर्देश सर्वोत्तम प्रथाओं का एक अच्छा संदर्भ है।

0

आपके सभी प्रतिक्रियाओं के लिए धन्यवाद।

अगर मैं विधि है कि (क Cocos2d खेल इंजन पद्धति का उपयोग करके) के साथ वस्तु की जरूरत है कहते हैं:

[self schedule:@selector(someMethod) interval:3.0]; 

वस्तु dereferenced है, अगर मैं इसे सीधे Cocos2d अनुसूचक में डालने के बिना फोन:

[self someMethod]; 

फिर भी एक वैध सूचक है। बस परीक्षण करने के लिए, मैंने इसे बरकरार रखा और यह चारों ओर रहता है।

तो सवाल यह है कि अब हम एआरसी को यह सोचने से रोकने के लिए कैसे मजबूर हैं कि हम इसके साथ क्या कर रहे हैं और इसे जारी कर रहे हैं?

इंस्टेंस वैरिएबल को किसी निजी प्रॉपर्टी में बदलना सुरक्षित रूप से करता है ताकि हम इसका उत्तर के साथ आगे बढ़ सकें।

+0

सिर्फ स्पष्टीकरण के लिए - आप कह रहे हैं कि ivar को @property पर स्विच करना वास्तव में समस्या को हल करता है? मेरी समस्या एनएसएमयूटेबल डिक्शनरी में ऑब्जेक्ट्स के साथ है जो बरकरार नहीं है। – rrbrambley

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