2012-05-21 12 views
12

मुझे अपने उद्देश्य-सी कक्षाओं में से एक में False के डिफ़ॉल्ट मान के साथ BOOL प्रकार का एक उदाहरण चर बनाने की आवश्यकता है। मैं यह कैसे करु? मैंने लोगों को अपनी .h फ़ाइल में परिभाषित किया है, लेकिन मुझे वास्तव में सार्वजनिक होने के लिए इस चर की आवश्यकता नहीं है। इस प्रकार मैं इसे अपनी .m फ़ाइल में नहीं रखूंगा? इसके अतिरिक्त, क्या मुझे इसे संपत्ति बनाना चाहिए? या क्या मैंने कभी कुछ संपत्ति नहीं बनाई जानी चाहिए? धन्यवाद।मैं उद्देश्य सी में एक बूल इंस्टेंस चर कैसे बना सकता हूं?

+0

प्रयास करें: '- (शून्य) viewDidLoad { BOOL झंडा = नहीं; } '। एक बार जब आप इसे .m फ़ाइल में घोषित करना चाहते हैं तो आप संपत्ति को .m फ़ाइल से संश्लेषित नहीं कर सकते हैं। –

+0

मुझे 'ध्वज' कहां परिभाषित करना चाहिए? क्या यह एमएम फाइल में समझ में नहीं आता है? हालांकि, मैं इसके लिए वाक्यविन्यास नहीं समझ सकता। Thx – Nosrettap

+0

एमएम कक्षा में संपत्ति को परिभाषित करता है जैसा कि आप करते हैं। एच .. यह कक्षा से निजी को कक्षा से बाहर नहीं लाएगा जो बाहर से उपलब्ध नहीं है। – iphonic

उत्तर

21

मुझे अपने उद्देश्य सी कक्षाओं में से एक में FALSE के डिफ़ॉल्ट मान के साथ प्रकार BOOL का एक उदाहरण चर बनाने की आवश्यकता है। मैं यह कैसे करु?

@implementation MyClass 
{ 
@private 
    BOOL myBool; 
} 

मैंने देखा है लोगों को अपने ज फ़ाइल में परिभाषित लेकिन मैं डॉन ':

मान लिया जाये कि आप वर्तमान Xcode उपयोग कर रहे हैं, तो आप इस तरह लागू करने में इवर घोषणा कर सकते हैं टी को वास्तव में सार्वजनिक होने के लिए इस चर की आवश्यकता नहीं है।

ऐतिहासिक रूप से, आपको कक्षाओं को लागू करने के तरीके के कारण @interface में आवृत्ति चर घोषित करना पड़ा। यह अब केवल तभी जरूरी है जब आप 32 बिट ओएस एक्स को लक्षित कर रहे हों।

इसके अतिरिक्त, क्या मुझे इसे एक संपत्ति बनाना चाहिए?

यह निर्भर करता है। आपको निश्चित रूप से इसे एक संपत्ति बनाना चाहिए यदि यह आपकी कक्षा के बाहरी एपीआई (असंबद्ध वर्गों या उप-वर्गों के उपयोग के लिए है। यदि यह वस्तु के आंतरिक राज्य का केवल एक हिस्सा है, तो आपको इसे संपत्ति बनाने की आवश्यकता नहीं है (और मैं नहीं ' टी)।

या मैं कभी कुछ एक संपत्ति? धन्यवाद नहीं करना चाहिए।

आप एआरसी का उपयोग नहीं कर रहे हैं, तो और प्रकार एक वस्तु प्रकार है (BOOL नहीं है) आप हमेशा यह सुनिश्चित करना चाहिए संश्लेषित एक्सेसर्स के मेमोरी मैनेजमेंट का लाभ लेने के लिए एक संपत्ति। यदि आप एआरसी का उपयोग कर हैं, तो ऐप्पल डेवलपर सूची पर सलाह एपीआई गुणों का हिस्सा है जो सामान बनाना है और सामान जो आंतरिक राज्य है Ivars के रूप में।

ध्यान दें कि आंतरिक स्थिति के लिए भी आप केवीओ का उपयोग करना चाहेंगे, इस मामले में, एक संपत्ति का उपयोग करें।

यदि आप इस बूल को संपत्ति के रूप में घोषित करते हैं और इसे संश्लेषित करते हैं, तो आपको स्पष्ट रूप से ivar घोषित करने की आवश्यकता नहीं है। आप संपत्ति केवल वर्ग खुद को "दृश्यमान" बनाना चाहते हैं, एक वर्ग विस्तार

@interface MyClass() 

@property (assign) BOOL myBool; 

@end 

@implementation MyClass 

@synthesize myBool = myBool_; // creates an ivar myBool_ to back the property myBool. 

@end 

नोट का उपयोग है कि, हालांकि संकलक रन टाइम पर, ऊपर के लिए चेतावनी का उत्पादन करेगा, किसी भी वर्ग को भेज सकते हैं setMyBool: या myBoolMyClass की वस्तुओं के लिए।

0

यदि आप इसे एक संपत्ति बनाते हैं तो यह सार्वजनिक है। यदि आप नहीं चाहते हैं कि वेरिएबल सार्वजनिक हो, तो संपत्ति का उपयोग न करें। आप सार्वजनिक क्यों नहीं बनना चाहते हैं? आप एक निजी श्रेणी के माध्यम से केवल पढ़ने योग्य संपत्ति हो सकती है और आप में लिखने योग्य बना सकते हैं।

आप अपने मीटर फ़ाइल में रख यदि आप आईओएस 5

@implementation MyClass { 
    BOOL _myBool; 
} 

मुझे लगता है कि इस iOS5 के लिए नई है का उपयोग कर सकते हैं। लेकिन मैंने इस तरह कोड भी देखा है:

@implementation MyClass { 
@private 
    BOOL _myBool; 
} 

आशा है कि इससे मदद मिलती है।

+0

"यदि आप इसे एक संपत्ति बनाते हैं तो यह सार्वजनिक है।" दरअसल नहीं। किसी वर्ग एक्सटेंशन या श्रेणी में गुणों को निजी रूप से घोषित किया जा सकता है। – jlehr

+0

लेकिन यदि आप कुछ नहीं करते हैं तो वे सार्वजनिक हैं। – Pfitz

+0

यदि आप कुछ भी नहीं करते हैं, तो आपके पास कुछ भी नहीं है। यह निर्धारित करता है कि कोई विधि या संपत्ति सार्वजनिक है या नहीं, जहां इसे घोषित किया गया है। यदि इसे हेडर में घोषित किया गया है, तो यह सार्वजनिक रूप से दिखाई देता है; अन्यथा यह नहीं है। (यद्यपि कोई रनटाइम प्रवर्तन नहीं है।) – jlehr

2

BOOL के एक सरल BOOL myBool साथ Ivars रूप में घोषित किया है, और @property (nonatomic, assign) BOOL myBool के साथ एक संपत्ति के रूप में कर रहे हैं। हालांकि ध्यान दें, BOOLean मूल्य NO (शून्य) के लिए inititalized हैं। यदि आपको अन्य कक्षाओं से पहुंचने के लिए एक बूल की आवश्यकता है, या एम फाइल में "ग्लोबल" है, तो iVar या किसी प्रॉपर्टी का उपयोग करें, अन्यथा उन्हें एक व्यक्तिगत विधि में स्कोप्ड वर्र्स के रूप में घोषित करें।

+0

बूल इवार्स हां में शुरू हुआ? क्या आप उस कथन पर पुनर्विचार करना चाहते हैं? – jrturton

+0

क्या आप विश्वास करेंगे ... स्वत: सुधार? – CodaFi

11

यदि आप एक निजी चर बनाना चाहते हैं तो आप श्रेणियों की शक्ति का उपयोग कर सकते हैं। निम्न उपाय अपनाते हैं, उदाहरण के लिए और .m फ़ाइल में एक वर्ग MyClass करें:

#import "MyClass.h" 

@interface MyClass() //This is an empty category on MyClass class 

@property (nonatomic, assign) BOOL myBool; 

@end 


@implementation MyClass 

@synthesize myBool = _myBool; 

-(void)myMethod { 
    self.myBool = YES; //this is using the property 
    _myBool = NO; //this is the instance variable, as @synthesize creates an instance variable for you 
    // both are private 
} 

@end 
1

आप .m फ़ाइल में घोषणा कर सकते हैं।

चाहे आप इससे बाहर निकलें, चाहे आप जो चाहते हैं उस पर निर्भर करता है। एक संपत्ति के रूप में, आप बाद में सेटटर/गेटर लागू कर सकते हैं जिसमें चेकिंग/गार्ड/जो कुछ भी शामिल है। इसके अतिरिक्त, आप कुंजी-मूल्य-पहुंच लागू कर सकते हैं।

यदि आपको इनमें से किसी की आवश्यकता नहीं है, तो संपत्ति के लिए कोई वास्तविक आवश्यकता नहीं है (लेकिन एक अच्छी परंपरा: आप कभी नहीं जानते, आपका कोड कैसे विकसित होगा)।

0

मैं का उपयोग 0, 1 के बजाय हाँ, नहीं

#define YES 1 
#define NO 0 
संबंधित मुद्दे