2014-07-04 13 views
16

सार:संपत्ति विरासत: ऑटो संपत्ति संश्लेषण संपत्ति संश्लेषित नहीं होगा

यह सवाल अलग पढ़ें/लिखें के साथ अंदर और वर्गों को एक दूसरे से संपत्ति विरासत में के बाहर से पहुँचता संयोजन में संपत्तियों की विरासत के बारे में है।

विवरण:

मैं एक वर्ग A और एक अन्य वर्ग B, जो A से विरासत है। में घोषित someProperty संपत्ति है। मैं चाहता हूं कि संपत्ति इन वर्गों के बाहर से पढ़ा जाए और अंदर से पढ़/लिखें।

केवल एक वर्ग के साथ, यह मृत-सरल है: आप .h में संपत्ति को केवल पढ़ने के रूप में घोषित करते हैं और आप इसे एक श्रेणी के अंदर .m में रीडराइट के रूप में फिर से घोषित करते हैं। किया हुआ।

लेकिन दो वर्गों के साथ, दूसरे से पाने, मैं नीचे संकलक चेतावनी B में मिलता है:

ऑटो संपत्ति संश्लेषण संपत्ति 'someProperty' संश्लेषित नहीं होगा, क्योंकि यह 'ReadWrite' है, लेकिन इसे

आह: एक और संपत्ति

यहाँ के माध्यम से संश्लेषित किया जाएगा 'केवल पढ़ने के लिए' कोड है

#import <Foundation/Foundation.h> 

@interface A : NSObject 

// This property shall be readonly from outside, but read/write from subclasses 
@property (readonly) SInt32 someProperty; 

@end 

बजे:

#import "A.h" 

@implementation A 
@end 

B.h:

#import <Foundation/Foundation.h> 
#import "A.h" 

@interface B : A 

@end 

B.m:

#import "B.h"  

@interface B() 

// compiler warning in the following property declaration: 
// /Users/.../B.m:12:41: Auto property synthesis will not synthesize property 
// 'someProperty' because it is 'readwrite' but it will be synthesized 
// 'readonly' via another property 
@property (readwrite) SInt32 someProperty; 

@end 

@implementation B 
@end 

क्यों यह चेतावनी दिखाई देता है और मैं इसे कैसे से बचने के लिए मेरे कोड की संरचना करना चाहिए?

उत्तर

10

आपको संपत्ति वर्ग (A) पर रीड-राइट के रूप में संपत्ति घोषित करने की आवश्यकता है, और उसके बाद संकलक को जागरूक करने के लिए उपclass (B) पर पुन: दावा करना होगा, जिसे आप वहां उपयोग करना चाहते हैं। तो, A एक्सेसर विधि होस्ट करता है और B इसका उपयोग करता है। आम तौर पर आप B को अन्य एक्सेसर विधि बनाने के लिए नहीं चाहते हैं ताकि आप संकलक को बता सकें कि सुपरक्लास (तकनीकी रूप से, बस एक और वर्ग) कार्यान्वयन प्रदान करेगा, तो आप @dynamic का उपयोग कर सकते हैं।

ध्यान दें कि आप भी A पर एक वर्ग (नहीं विस्तार) घोषित कर सकते हैं B मीटर जो एक्सेसर विधि स्पष्ट रूप से घोषणा करता है कि के रूप में (एक संपत्ति है, बस एक विधि का उपयोग नहीं) में, क्या आप वास्तव में में रुचि रखते हैं है (आप वास्तव में अन्य किसी भी चीज को नहीं चाहते हैं जो एक संपत्ति निर्दिष्ट करता है और आप वास्तव में यह सुनिश्चित करने के लिए रखरखाव ओवरहेड नहीं चाहते हैं कि संपत्ति गुण सुपर और सबक्लास में मिलते हैं) ...

+1

मुझे नहीं पता था @ गतिशील। मैं यही चाहता था। –

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