2009-12-19 9 views
24

मैंने देखा है कि ऐप्पल के कुछ उदाहरणों में गुणों पर retain और readonly संशोधक दोनों शामिल हैं। retain को शामिल करने का क्या मतलब है यदि कोई readonly संशोधक का उपयोग कर रहे हैं तो कोई सेटटर उत्पन्न नहीं होता है?एक घोषित संपत्ति दोनों को बनाए रखने और पढ़ने के लिए क्यों उपयोग करती है?

उदाहरण: @property (retain, readonly) NSString *title; एनिमेटेडटेबल व्यू नमूना से।

उत्तर

17

आप कक्षा विस्तार में एक दूसरी, निजी पठनलेख घोषणा शामिल कर सकते हैं। सभी संदर्भों के लिए मेमोरी मैनेजमेंट स्कीम को आईआईआरसी से मेल खाना जरूरी है, इसलिए आपको "रीडोनली, रीटेन" जैसे सुस्तता मिलती है।

+3

यह पूरी तरह से मूर्ख नहीं है; संशोधक बनाम @synthesize का मैट्रिक्स ऐसा है कि गेटर का कोड ** ** बदल सकता है। यह समझने की कोशिश कर रहा है कि वास्तव में कौन से संशोधक बनाम सक्षम किए जा सकते हैं। जिसे # वार्न मिन्यूशिया के साथ छेड़छाड़ करना चाहिए और अंत में समझना मुश्किल होगा। बस पढ़ने के लिए बेहतर "readonly-> readwrite को छोड़कर एक जैसा होना चाहिए"। – bbum

+0

आंकड़े मुझे अपनी टिप्पणी पर विस्तार करना चाहिए .... – bbum

36

इस तरह एक पैटर्न या, अधिक विशेष रूप से (केवल पढ़ने, को बनाए रखने) सक्षम बनाता है:

Foo.h:

@interface StuffHolder:NSObject 
@property(readonly, retain) MyStuff *stuff; 
@end 

Foo.m:

@interface StuffHolder() 
@property(readwrite, retain) MyStuff *stuff; 
@end 

@implementation StuffHolder 
@synthesize stuff; 
@end 

अंतिम परिणाम है एक ऐसी संपत्ति जो कार्यान्वयन के भीतर रीडराइट होने के दौरान सार्वजनिक रूप से पढ़ा जाता है और जिसके लिए दोनों सेटटर और गेटर को संकलक द्वारा स्वचालित रूप से संश्लेषित किया जाता है। statement without an effect के लिए कुछ समान - -

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

+0

इसे केवल पढ़ने के लिए विज्ञापित किया गया है लेकिन यह अभी भी लिखने योग्य होगा यदि संकलक ने इसके लिए एक सेटटर उत्पन्न किया है, है ना? – dreamlax

+1

अगर कोई सेटटर को कॉल करने के लिए कोड लिखना था, तो निश्चित रूप से, लेकिन कहीं भी विधि घोषित किए बिना, उन्हें एक चेतावनी दिखाई देगी ... – bbum

+0

"सार्वजनिक" केवल पढ़ने योग्य गुण (शीर्षलेख में घोषित) और "निजी" गुण बनाए रखें (स्रोत फ़ाइल में घोषित) अब समर्थित नहीं हैं (एक्सकोड 3.2.3 - आईफोन एसडीके 4 और जीसीसी 3.2 के साथ) त्रुटि: संश्लेषित गुण 'एक्स' और 'वाई' दोनों दावा ivar 'z' – Felix

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

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