2011-07-08 10 views
8

ऑब्जेक्टिव-सी में, वहाँ मीटर फ़ाइल में hackish तरीका निजी तरीकों बनाने के लिए एक तरह से है,:ऑब्जेक्टिव-सी में निजी संपत्तियों का निर्माण

@interface FooClass (PrivateMethods) 
- (void) doBar:(id)barAction withBaz:(id)bazAction; 
@end 

यह तरीकों के लिए महान काम करता है। मैं एक संपत्ति के साथ भी ऐसा ही करने की कोशिश की:

@interface BarClass (PrivateMethods) 
@property (nonatomic, strong) BazObject *myBaz; 
@end 

@implementation BarClass 
@synthesize myBaz = _myBaz; 
[...] 
@end 

यह एक संकलन चेतावनी लाया: संपत्ति 'PrivateMethods' वर्ग कार्यान्वयन में लागू नहीं किया जा सकता है श्रेणी में घोषित कर दिया।

@implementation BarClass (PrivateMethods) 
@synthesize myBaz = _myBaz; 
@end 

तब:: मैं एक श्रेणी में अपनी संपत्ति को स्थानांतरित करने की कोशिश की @synthesize is not allowed in a category's implementation.

स्पष्ट जवाब है, "कोशिश कर छोड़ दिया, बस ivars का उपयोग करें", लेकिन मैं एप्पल में लोगों द्वारा बताया गया है कि वे ' ve (व्यक्तिगत रूप से) पूरी तरह से गुणों का उपयोग करने के लिए चले गए। वे जो सुरक्षा लाते हैं (जैसे बंदूक पर सुरक्षा, पैर में खुद को शूट करना कठिन होता है) मुझे सभी को खुश करता है, तो क्या नग्न शिवराओं का उपयोग किए बिना ऐसा करने का कोई तरीका है?

उत्तर

16

उपयोग एक वर्ग (कोष्ठकों के अंदर किसी श्रेणी नाम के अभाव ध्यान दें) के बजाय एक class extension:

@interface BarClass() 
@property (nonatomic, strong) BazObject *myBaz; 
@end 

@implementation BarClass 
@synthesize myBaz = _myBaz; 
[...] 
@end 

आप इस सवाल (और उत्तर) पढ़ने के लिए चाहते हो सकता है के रूप में अच्छी: Does a private @property create an @private instance variable?

4

मैंने यही किया है और यह मेरे लिए काम करता है। परिवर्तन यह है कि अब आप श्रेणियां नहीं बना रहे हैं। इसके बजाय आप कक्षा के विस्तार बना रहे हैं।

@interface BarClass() 
@property (nonatomic, retain) BazObject *myBaz; 
@end 

@implementation BarClass 
@synthesize myBaz = _myBaz; 
[...] 
@end 
संबंधित मुद्दे

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