2010-04-02 5 views
10

के साथ निजी इंस्टेंस वर्र्स की प्रतिलिपि बनाने के लिए सबसे अच्छा अभ्यास मैं यहां कुछ स्पष्ट याद कर रहा हूं, लेकिन मैं अपनी वस्तुओं में से एक पर एनएससीपीआईपी लागू कर रहा हूं। उस ऑब्जेक्ट में निजी आवृत्ति चर हैं जो गेटर्स के माध्यम से प्रकट नहीं होते हैं, क्योंकि उन्हें ऑब्जेक्ट के बाहर उपयोग नहीं किया जाना चाहिए।एनएससीपीआई

copyWithZone: के कार्यान्वयन में, मुझे नए उदाहरण को आवंटित/इनिट करने की आवश्यकता है, लेकिन वर्तमान स्थिति से मेल खाने के लिए अपने राज्य को भी स्थापित करें। मैं स्पष्ट रूप से copyWithZone: के अंदर से वर्तमान निजी स्थिति तक पहुंच सकता हूं, लेकिन मैं इसे नए ऑब्जेक्ट में सेट नहीं कर सकता, क्योंकि उस राज्य के लिए कोई एक्सेसर नहीं है।

क्या डेटा गोपनीयता को बरकरार रखने के दौरान इसके आसपास एक मानक तरीका है?

धन्यवाद।

उत्तर

8

सबसे पहले, आप हमेशा ही टिककर खेल होना चाहिए, भले ही वे निजी रहे हैं। आपके ऑब्जेक्ट को केवल एक्सेसर्स का उपयोग करके अपने स्वयं के ivars तक पहुंचना चाहिए (मामलों की बहुत छोटी संख्या को छोड़कर)। यह आपको स्मृति प्रबंधन पर पीड़ा का एक बड़ा सौदा बचाएगा।

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

अपनी मेमोरी प्रबंधन को सही करने के लिए बहुत सावधान रहें। यदि आपको [super copyWithZone:] पर कॉल करने की आवश्यकता है, तो आपको NSCopyObject() की जटिलताओं पर भी पढ़ना चाहिए और यदि आप इसका उपयोग नहीं करते हैं तो भी यह आपको कैसे प्रभावित करता है। मैंने इस पर "NSCopyObject() considered harmful."

+0

निजी एक्सेसर्स के साथ-साथ एनएससीपीओब्जेक्ट के खतरों के उल्लेख के लिए धन्यवाद। –

+0

मुझे यकीन नहीं है कि रीडोनली एक्सेसर्स मेमोरी प्रबंधन में कैसे मदद करता है? यदि आप इसे 'असाइन' या' बनाए रखने 'के साथ उपयोग नहीं कर रहे हैं, तो इससे कोई फर्क नहीं पड़ता कि आप सीधे गेटर या चर का उपयोग करते हैं या नहीं। – Hemant

+0

@ हेमंत, क्योंकि कॉलर को इस बारे में सावधान रहने की आवश्यकता नहीं है कि संपत्ति वर्तमान में (या भविष्य में) पढ़ी गई है या नहीं। यह कॉलर का व्यवसाय नहीं है, और यह समय के साथ बदल सकता है, और फिर आपको उस कोड के हर टुकड़े का शिकार करना होगा जिसने इसे गलत तरीके से किया था। सरल नियमों से चिपके हुए, त्रुटियां स्पष्ट हो जाती हैं। जब आप कहते हैं "ओह, जब मुझे पता चल जाए कि यह वर्तमान में ठीक है" तो आप रखरखाव के सिरदर्द के लिए खुद को खोल रहे हैं। –

5

आप सीधे प्रतिलिपि के आवृत्ति चर का उपयोग कर सकते हैं। आप एक ही पॉइंटर डीरफ्रेंसिंग सिंटैक्स का उपयोग करते हैं जिसका उपयोग आप एक स्ट्रक्चर के साथ करेंगे। तो, उदाहरण के लिए, अपने वर्ग इस है यदि:

@interface MyCopyableClass : NSObject { 
    int anInstanceVariable; 
} 
@end 

आप ऐसा कर सकते हैं:

- (id)copyWithZone:(NSZone *)zone { 
    MyCopyableClass *theCopy = [[[self class] allocWithZone:zone] init]; 
    theCopy->anInstanceVariable = anInstanceVariable; 
    return theCopy; 
} 
1

पर एक विकल्प चुना है जो एक कस्टम प्रारंभकर्ता है जो निजी iVar मान स्वीकार करता है। तो आप इसे इस तरह बनाते हैं:

-(id) initWithPropertyOne:(SomeClass *) anObject andPropertyTwo:(SomeClass *) anotherObject; 

जब आप प्रतिलिपि को तुरंत चालू करते हैं, तो केवल कस्टम प्रारंभकर्ता का उपयोग करें।