2010-03-26 4 views
28

मैं एक संपत्ति के रूप में उपलब्ध मूल वर्ग पर एक विधि बनाने के लिए एक श्रेणी का उपयोग करना चाहता हूं।उद्देश्य-सी श्रेणियां: क्या मैं अपनी श्रेणी में नहीं एक विधि के लिए एक संपत्ति जोड़ सकता हूं?

क्लास ए:

@interface ClassA 
- (NSString*)foo; 
@end 

क्लास ए श्रेणी

@interface ClassA (Properties) 
- (void)someCategoryMethod; 
@property (nonatomic, readonly) NSString *foo; 
@end 

अब जब मैं यह कर, यह काम करने लगता है (संपादित करें: हो सकता है कि यह काम नहीं करता, यदि ऐसा नहीं होता शिकायत करें लेकिन मैं अजीबता देख रहा हूं), लेकिन यह मुझे चेतावनी देता है क्योंकि मैं अपनी श्रेणी के कार्यान्वयन में संपत्ति को संश्लेषित नहीं कर रहा हूं। मैं संकलक कैसे बता सकता हूं सब कुछ वास्तव में ठीक है क्योंकि मूल वर्ग मेरे लिए संपत्ति संश्लेषित करता है?

+0

गुण (ज्यादातर) केवल '-फू' और '-सेटफू' विधि के लिए चीनी हैं। आप श्रेणियों में कोई अतिरिक्त आवृत्ति चर नहीं जोड़ सकते हैं, लेकिन आप उन तरीकों को परिभाषित कर सकते हैं। @property वाक्यविन्यास वैकल्पिक है, लेकिन सुझाव दिया (मुझे यकीन नहीं है कि यह काम करता है)। –

+1

किसी भी व्यक्ति को बैकिंग इवर (श्रेणी में परिभाषित) के साथ एक संपत्ति जोड़ने की कोशिश करने के लिए, इसे देखें: http://oleb.net/blog/2011/05/faking-ivars-in-objc-categories-with- सहयोगी-संदर्भ/ – Senseful

+0

[उद्देश्य-सी: श्रेणी में संपत्ति] के संभावित डुप्लिकेट (http://stackoverflow.com/questions/8733104/objective-c-property-in-category) – hfossli

उत्तर

32

यहाँ चेतावनी आपको मिलने वाला है:

warning: property ‘foo’ requires method '-foo' to be defined - use @synthesize, @dynamic or provide a method implementation

इस चेतावनी को दबाने के लिए, इस अपने कार्यान्वयन में:

@dynamic foo;

+0

बस मुझे क्या चाहिए, धन्यवाद! –

1

यदि आपकी श्रेणी के इंटरफ़ेस में कुछ घोषित किया गया है, तो इसकी परिभाषा आपकी श्रेणी के कार्यान्वयन में है।

+0

लेकिन मेरे पास पहुंच नहीं है 'कक्षा' का स्रोत। आइए मान लें कि यह UIKit में कक्षा है कि मैं "सुधार" कर रहा हूं। –

+0

आपको शायद एक उप-वर्ग बनाना चाहिए, न कि श्रेणी। –

+3

यदि यह उप-वर्ग है, तो इस वर्ग के उदाहरणों में जिन क्षेत्रों में मेरा नियंत्रण नहीं है, उनके पास इस कोड और गुण नहीं होंगे। –

1

मैं इस पर दो लेख लिखा था, हालांकि आप जिस प्रश्न पूछ रहे हैं उससे अवधारणा थोड़ा अलग है। श्रेणियों से http://compileyouidontevenknowyou.blogspot.com/2012/06/adding-properties-to-class-you-dont.html

  • पहुँच Ivars:

    1. आधार वर्ग को बिना छुए श्रेणियों के लिए प्रॉपर्टी जोड़ें http://compileyouidontevenknowyou.blogspot.com/2012/06/if-you-want-to-keep-everything-in-your.html

    यह एक बहुत विधि swizzling तुलना में बेहतर है, कम से कम: जिस तरह से सुरक्षित।