2013-03-02 8 views
5

एक्सकोड 4.4 से पहले अधिकांश परियोजनाओं में, मुझे एहसास हुआ कि डेवलपर्स ने एक ही नाम के साथ एक ivar और एक संपत्ति घोषित की है। उदाहरणउसी नाम से इवर और संपत्ति घोषित करने की आवश्यकता क्यों है?

@interface SecondViewController : UIViewController 
{ 
    NSString *string; 
} 

@property (strong, retain) NSString *string; 

तो मुझे नहीं पता क्यों?

+1

dup: http://stackoverflow.com/questions/5555736/objective-c-why-do-we-declare-ivars-in-the-h-member-area- अगर-संपत्ति-लगता है- – justin

उत्तर

1

मैं दूसरों के लिए बात नहीं कर सकता, लेकिन मैं एक ही नाम का उपयोग नहीं करता हूं। यदि मैं एक इंस्टेंस वैरिएबल घोषित करता हूं, तो यह एक अग्रणी अंडरस्कोर के साथ है, इसलिए यह स्पष्ट है कि मैं इंस्टेंस वैरिएबल या सेटर/गेटर विधि का जिक्र कर रहा हूं।

एक्सकोड 4.4+ के साथ आपको आवृत्ति चर घोषित करने की आवश्यकता नहीं है या @synthesize पर कॉल करने की आवश्यकता नहीं है और संकलक स्वचालित रूप से एक अग्रणी अंडरस्कोर के साथ एक आवृत्ति चर बना देगा, और आपके लिए सेटटर/गेटर विधि प्रदान करेगा।

हालांकि मुझे नहीं लगता कि यह तंत्र एक बहुत अच्छा विचार है, क्योंकि यह डेवलपर्स को अपनी कक्षा के गुणों का खुलासा करने के लिए प्रोत्साहित करता है जिन्हें प्रकट नहीं किया जाना चाहिए।

उदाहरण के लिए, इस शुरुआत IOS 6 विकास से लिया जाता है:,

@interface BIDViewController : UIViewController 
@property (weak, nonatomic) IBOutlet UIButton *button; 
- (IBAction)buttonPressed:(UIButton *)sender; 
@end 

अब जबकि मैं समझता हूँ कि आप एक साथ बहुत से अवधारणाओं के साथ शुरुआत कर भ्रमित करने के लिए नहीं करना चाहते हैं, तो आप तुरंत है UIButton ऑब्जेक्ट और इस व्यू कंट्रोलर के उपयोगकर्ताओं को एक्शन विधि दोनों को उजागर करके ऑब्जेक्ट ओरिएंटेड एनकैप्यूलेशन का उल्लंघन किया, और न ही इसका खुलासा किया जाना चाहिए।

क्या होता है, उदाहरण के लिए, अगर एक का उपयोग कर वर्ग करता है:

BIDViewController *vc = ...; 
vc.button = nil; 

या

vc.buttonPressed(mySegmentedControl); 

सभी नरक टूट जाता है ढीला। अब जबकि कार्यक्रम को तोड़ने के 1000 तरीके हैं और हम उन सभी के खिलाफ बचाव नहीं कर सकते हैं, हम पहले से ही कमजोर सिस्टम नहीं बनाना चाहते हैं (उद्देश्य-सी परिभाषित करने के मामले में मूल्यवान छोटी प्रदान करता है कि कौन कॉल कर सकता है और कौन नहीं कह सकता आपकी विधियों के) कमजोर।

उपरोक्त क्रियान्वयन बेहतर निजी उदाहरण चर और तरीकों का उपयोग कर किया जाता है, जो दोनों के इंटरफ़ेस बिल्डर द्वारा सम्मानित किया गया है:

@implementation BIDViewController() 
{ 
    IBOutlet UIButton *_button; 
} 
- (IBAction)_buttonPressed:(UIButton *)sender; 

@end 

और किसी भी का उपयोग कर वर्गों है कि मॉडल को तोड़ने की एक मुश्किल समय होगा।

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

+0

"तो यह स्पष्ट है कि यदि मैं आवृत्ति चर या सेटर/गेटर विधि का जिक्र कर रहा हूं" - यह वैसे भी स्पष्ट है: 'self.foo' एक संपत्ति है,' foo' एक ivar है। –

+0

@ H2CO3 'self.' बिट को याद करने में एक आसान गलती है ... – trojanfoe

+0

जैसा कि आप इस पोस्ट में देख सकते हैं: http://inessential.com/2010/06/28/how_i_manage_memory लेखक एक ivar का उपयोग करते हैं और एक ही नाम के साथ एक संपत्ति। और मैं उसका इरादा नहीं समझता। – Proton

7

बस स्टाइल का मामला और पिछले कंपाइलर्स से व्यवहार करने के लिए उपयोग किया जाता है।

अब नए कंपाइलर में यह आवश्यक नहीं है। जैसे ही आप एक संपत्ति बनाते हैं, दृश्य के पीछे एक इवर बनाया जाता है साथ ही साथ संश्लेषित हो जाता है।

कंपाइलर उपनाम के साथ _propertyName के रूप में संश्लेषित करता है, यहां तक ​​कि आप इस डिफ़ॉल्ट व्यवहार को बदलने का विकल्प चुन सकते हैं।

@interface AppDelegate : NSObject <NSApplicationDelegate>{ 
    NSString *bigString; 
} 
@property(strong)NSString *smallString; 
@end 

@implementation AppDelegate 
@synthesize smallString=bigString; 
-(void)awakeFromNib{ 
    [email protected]"hello"; 
    NSLog(@"%@",self.smallString); 
} 

@end 
+0

यह सही उत्तर है, +1। यह एक्सकोड संस्करण का मामला नहीं है, यह भाषा बोली संस्करण का मामला है, जिसे संकलक के एक निश्चित संस्करण में लागू किया गया है। –

+0

@ एच 2CO3: धन्यवाद, और जब भी आप मुझे +1 देते हैं, तो मुझे अच्छा लगता है :) –

+0

इस पंक्ति का अर्थ क्या है '@ सिंथेसाइज छोटे स्ट्रिंग = bigString; ' – Proton

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