2009-09-10 13 views
9

क्या स्मृति प्रबंधन लाभों के लिए निजी चर के लिए @properties बनाना बुरा है?क्या यह स्मृति प्रबंधन लाभों के लिए निजी चर के लिए @properties का उपयोग करने के लिए "खराब" है?

यह कई निजी चर के लिए सार्वजनिक सामना @properties होने के लिए गन्दा और गलत लगता है।

(मुख्य रूप से, मैं निजी ivars कम स्मृति की स्थिति के दौरान संबंधित "घटना" तरीकों का उपयोग कर रिहा कर रहा हूँ।)

उदाहरण:

[name release]; name = nil; 
:
मैं आमतौर पर यह एक निजी इवर जारी करने के लिए करते हैं

लेकिन @properties साथ, मैं यह कर सकता:

self.name = nil; 

मेरी कोड में बाद में, यह कर देगा, इसलिए , KVO सूचनाएं

if(!name) 
    name = [[NSString alloc] initWithFormat:@"Hi %@",inputName]; 

उत्तर

23

संपत्ति को निजी रखने का विकल्प है। आप संपत्ति केवल अपने वर्ग के भीतर सुलभ बनाने के लिए निम्नलिखित कोड (अपने .m फ़ाइल में) का उपयोग कर सकते हैं:

#import "MyClass.h" 

@interface MyClass() 
    @property (retain) NSString* privateString; 
@end 

@implementation MyClass 

    @synthesize privateString; 
    // Your code here 

@end 

अब आप एक संपत्ति में आसानी है, लेकिन अन्य वर्गों अभी भी यह तक नहीं पहुँच सकता , भले ही वे आपकी .h फ़ाइल आयात करें! विधि के लिए UIViewController कक्षा संदर्भ में सेब प्रलेखन से

+0

यह बहुत अच्छा है, लेकिन यह एक हैक की तरह लगता है। मुझे यकीन नहीं है कि मैं इसे अपने कोड में करने जा रहा हूं, लेकिन कम से कम मुझे पता है कि अब मैं क्या कर रहा हूं इसका एक विकल्प है। धन्यवाद!! – bentford

+13

यह एक हैक नहीं है, यह एक्सटेंशन का एक स्पष्ट रूप है जिसे एक्सटेंशन कहा जाता है। । "कक्षा के लिए सार्वजनिक रूप से घोषित एपीआई होना आम बात है और उसके बाद कक्षा या फ्रेमवर्क द्वारा पूरी तरह से उपयोग के लिए अतिरिक्त एपीआई घोषित किया गया है जिसमें कक्षा" –

+5

है "यह बिल्कुल हैक नहीं है और 100% पहली जगह भाषा में क्लास एक्सटेंशन क्यों जोड़े गए थे। इस पैटर्न को गस्टो के साथ गले लगाओ। – bbum

0

सार्वजनिक गुण मुझे नहीं लगता कि एप्पल यह सिफारिश की गई है के लिए है, क्योंकि कभी कभी नहीं के बराबर करने के लिए एक संपत्ति की स्थापना सिर्फ चर रिहा अलावा अन्य दुष्प्रभाव हो सकते हैं (या एक कस्टम,: शून्य करने के लिए सेट की जरूरत सेटर विधि जो कुछ और करता है)।

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

+0

उद्धरण - (शून्य) viewDidUnload: "किसी भी वस्तु (दुकानों वाले भी) के स्वामित्व त्यागना पसंदीदा तरीका इसी एक्सेसर विधि का उपयोग करने का मान सेट करने के लिए है ऑब्जेक्ट टू नील " – bentford

+0

मैंने मूल कारण ढूंढने के लिए चारों ओर देखा क्योंकि मैंने सोचा कि यह बुरा था (क्योंकि मैं भूल गया था), और मुझे यह मिला: http://stackoverflow.com/questions/192721/why-shouldnt-i-use- obective-c-2-0-accessors-in-init-dealloc। ऐसा लगता है कि यह केवल init या dealloc में एक चिंता है। –

2

आपकी सुविधा के लिए गुण मौजूद हैं। यदि आप नहीं चाहते हैं कि अन्य लोग आपकी कक्षाओं में मौजूद गुणों का उपयोग करें, तो उन्हें दस्तावेज़ न करें।

+1

लेकिन वे आपकी .h फ़ाइल में दिखाई दे रहे हैं। Andyvn22 इस के लिए एक वैकल्पिक समाधान है। – bentford

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

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