2010-11-02 27 views
8

मुझे अपने आईफोन विकास अनुप्रयोगों में self अभिव्यक्ति का उपयोग कब करना चाहिए? कहें कि मेरे पास 2 फ़ील्ड हैं: UITextField *text1; और NSString *str1; बनाए रखा और संश्लेषित।मुझे "स्वयं" कीवर्ड का उपयोग कब करना चाहिए?

जब मैं इन 2 क्षेत्रों में से किसी एक को एक्सेस कर रहा हूं, तो मुझे कब और कब self.text1 और self.str1 का उपयोग नहीं करना चाहिए?

उत्तर

7

कुछ निश्चित परिस्थितियों में जहां यह आम तौर पर self. -expression एक संपत्ति का उपयोग करने के उपयोग करने के लिए हतोत्साहित किया है रहे हैं। आम तौर पर आपहमेशाउपयोगself एक संपत्ति के किसी भी उपयोग के लिए यह सबसे सुरक्षित और जटिल तरीका है। विशेष रूप से यदि आप बनाए रखा उपयोग करते हैं, तो स्मृति प्रबंधन आपके लिए किया जाएगा। इस नियम से

दो अपवाद:

  • किसी भी init विधि।
  • dealloc में।

दोनों मामलों में आप आंशिक रूप से प्रारंभ ऑब्जेक्ट से निपट रहे हैं। ऐसे कुछ दुष्प्रभाव होते हैं जो सेटर्स या गेटर्स का उपयोग करते समय हो सकते हैं - क्योंकि वे विधियां हैं और इसलिए ओवरराइड किया जा सकता है।

उदाहरण लिए, किसी प्रॉपर्टी foo उस वर्ग B द्वारा subclassed कर दिया गया है के साथ एक कक्षा A ले। उपवर्ग B एक संपत्ति bar कहते हैं और foo के लिए सेटर overrode। अब आप अपने init -method setFoo: कहता है, क्योंकि आप कुछ प्रारंभिक मूल्य के साथ self.foo = ... इस्तेमाल किया। उप-वर्ग, हालांकि, इस सेटटर में bar के मान तक भी पहुंचता है। लेकिन इस मामले में, ऐसा हो सकता है कि बार को कभी शुरू नहीं किया गया है और कुछ मनमानी डेटा पर अंक दिया गया है। मेरे कारण init में एक सेटर को कॉल करना क्रैश करता है, हालांकि संभावना आपके कोड में बहुत अधिक नहीं हो सकती है।

8

self कोई कीवर्ड नहीं है, यह एक अभिव्यक्ति है। इसके अतिरिक्त, आप इसे किसी भी समय किसी विधि या संपत्ति को संदर्भित करना चाहते हैं, या स्वयं सीधे इसका उपयोग करते हैं। ।

+1

के छोटे नियम तो ऐसा लगता है जैसे कि यह जावा 'this' अभिव्यक्ति है, जो हमेशा जब तक एक ही नाम – binnyb

+0

आप सही कर रहे हैं के साथ चर के साथ काम की आवश्यकता नहीं है के समान है। लेकिन 'str1 = @" abc "' कार्य नहीं करेंगे: –

+12

एक महत्वपूर्ण अंतर यह है कि 'self.str1 = @" abc "' एक्सेसर विधि ('' setStr1) का उपयोग करेगा। 'बनाए रखने' विशेषता वाले गुणों का उपयोग करते समय, यह अंतर महत्वपूर्ण है। तो, यह वास्तव में "जावा के समान नहीं है"। –

0

तक "अपने आप को" मैं निश्चित रूप से कर रहा हूँ, आप जिस कक्षा में काम कर रहे हैं के कहने की बात कर रहा बारे में उद्देश्य-सी में कुछ नहीं पता है, लेकिन इस (सी की तरह अन्य भाषाओं से this कीवर्ड की तरह एक बहुत लग रहा है ++ , सी #, जावा, पीएचपी, और अन्य)। यदि ऐसा है, तो मेरी सलाह हमेशा इसका उपयोग करना है। इस तरह, यदि आप कभी भी (गलती से) एक स्थानीय चर को उसी नाम से परिभाषित करते हैं, तो आपका कोड नहीं टूट जाएगा।

हालांकि, मुझे यह भी जोड़ना चाहिए कि यह प्रोग्रामर समुदायों में ज्वालामुखी के इतिहास के साथ धार्मिक बहस का कुछ हद तक है। तो नमक के अनाज के साथ यह सलाह लें और जो भी आपको सबसे ज्यादा समझ में आता है उसका उपयोग करें। बस इसके बारे में सुसंगत रहें।

+0

लेकिन ध्यान दें कि यह उद्देश्य-सी में केवल एक शैली/रखरखाव मुद्दा नहीं है - जब एक ऐसी संपत्ति का उपयोग करते हुए जिसमें गेटर/सेटर विधियां हों, तो "स्वयं" को छोड़कर गेटर/सेटर को छोड़ दिया जाता है; एक असली अर्थपूर्ण अंतर है। –

+0

जो वही है जो मैं ढूंढ रहा था, अच्छा – binnyb

+0

@ डेविड गेलहर - क्षमा करें। आपको बताया था कि मुझे नहीं पता था। : पी –

6

अपने उदाहरण में आप self का उपयोग करते समय सीधे उदाहरण चर का उपयोग नहीं कर रहे हैं, इसके बजाय आप उन गुणों तक पहुंच रहे हैं जिन्हें आपने परिभाषित किया है। आप गुण उपयोग कर रहे हैं

@interface Foo : NSObject { 
    NSString *_bar; 
} 

@property (nonatomic, retain) NSString *bar; 

@end 

@implementation Foo 
@synthesize bar = _bar; 
-(void)baz { 
    _bar = @"ivar"; //accessing the ivar 
    self.bar = @"property"; //accessing the ivar via the property 
} 

@end 

सामान्य में, वहाँ इवर का उपयोग करने का कोई कारण बताया गया है:

इस उदाहरण पर विचार। इसमें & आपके लिए मूल्य जारी करने के स्वचालित रूप से बनाए रखने का अतिरिक्त लाभ है।

लेकिन अन्य मामले मौजूद हैं जब आपकी संपत्तियों में readonly संशोधक होगा। इन मामलों में अपने मूल्य निर्धारित करने के लिए सीधे अपने इवरों तक पहुंचना आवश्यक है।

+0

मैं उलझन में हूँ। _foo और foo कहां घोषित किया गया है? क्या वे वास्तव में आपके बाज़ विधि में _bar और बार होना चाहिए? –

+0

क्षमा करें, मैंने अपने उदाहरण में एक टाइपो बनाया है। संशोधित –

5

यदि आपके पास कस्टम गेटटर है तो कभी-कभी एक विधि कॉल के भीतर self का उपयोग करना भी एक अच्छा विचार है। कोर डेटा-उपयोग अनुप्रयोग के भीतर managedContext ऑब्जेक्ट एक अच्छा उदाहरण है। यदि आप इसे self.managedContext से संदर्भित करते हैं, तो आप ऑब्जेक्ट को ओवरराइड कर सकते हैं और उस ऑब्जेक्ट को सेट कर सकते हैं, जब यह nil है। कोर डेटा का उपयोग करने वाले एप्लिकेशन को बनाते समय एक्सकोड द्वारा उत्पन्न कोड का संदर्भ लें।

यहाँ, XCode द्वारा बनाया गया कोड का एक उदाहरण है वास्तव में:

@interface YourAppDelegate : NSObject <UIApplicationDelegate> 
{ 
@private 
    NSManagedObjectContext *managedObjectContext_; 
} 


@property (nonatomic, retain, readonly) NSManagedObjectContext *managedObjectContext; 



@implementation ContractionTimerAppDelegate 

/** 
Returns the managed object context for the application. 
If the context doesn't already exist, it is created and bound to the persistent store coordinator for the application. 
*/ 
- (NSManagedObjectContext *)managedObjectContext { 

    if (managedObjectContext_ != nil) { 
     return managedObjectContext_; 
    } 

    NSPersistentStoreCoordinator *coordinator = [self persistentStoreCoordinator]; 
    if (coordinator != nil) { 
     managedObjectContext_ = [[NSManagedObjectContext alloc] init]; 
     [managedObjectContext_ setPersistentStoreCoordinator:coordinator]; 
    } 
    return managedObjectContext_; 
} 

@end 
1

यदि आप "संश्लेषण" चर, आपको चाहिए "आत्म।" परिवर्तनीय अंगूठे

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