2011-01-19 9 views
7

मैं बहुत अधिक चीज़ों के लिए गुण बनाने के लिए उपयोग किया जाता हूं। शायद बहुत ज्यादा, दिया गया। मैं इंस्टेंस वैरिएबल का भी उपयोग करता हूं, लेकिन मैं उन्हें self->myvar के साथ संदर्भित नहीं करता बल्कि बल्कि myvar पर संदर्भित करता हूं।का उपयोग -> कोको में

मुझे हाल ही में self-> का उपयोग करके एक कोड के संपर्क में लाया गया था जहां मैंने एक संपत्ति का उपयोग किया होता। जब मैंने कहा कि @property (बनाए रखें) का उपयोग करने के कारणों में से एक कारण है क्योंकि मैं स्पष्ट रूप से अपनी वस्तु को बरकरार रखना नहीं चाहता, मुझे बताया गया कि मैं "आलसी" हूं। यह शायद सच है, लेकिन यह भी है कि मैं उन बगों से बचना चाहता हूं जहां मैं बनाए रखना भूल गया था।

वैसे भी, आप लोग कोको कोड में -> के बारे में क्या सोचते हैं?

+4

आत्म> "" मैं हाल ही में एक कोड के लिए का एक बहुत का उपयोग कर अवगत कराया गया था "। .. चारों ओर मुड़ें ... भागो !!!! –

उत्तर

6

आलस्य एक गुण है।

कॉपी की आवृत्ति चर का उपयोग करने के लिए copyWithZone: में -> का उपयोग करता हूं। (मैं संपत्ति accessors यहाँ एक ही कारण मैं उन्हें init या dealloc में उपयोग नहीं करते के लिए उपयोग नहीं करते -। वे साइड इफेक्ट है कि आधे से प्रारंभ नकल में बुरा होगा गति प्रदान कर सकते) मैं भी इस संदर्भ में self-> उपयोग करें, क्योंकि मैं

other->foo = [self->foo copy]; 
other->bar = [self->bar copy]; 
other->baz = self->baz; //Non-object or object not owned (may be omitted entirely in the latter case) 

मैं एक और संदर्भ में मैं वस्तुओं पर -> का उपयोग के बारे में सोच नहीं सकते हैं: जिस तरह से है कि पढ़ता है की तरह।

1

आईएमओ सादे ivar पहुंच पर -> का उपयोग करने में बहुत अधिक मूल्य नहीं है। कभी-कभी यह डिबगिंग उद्देश्यों के लिए उपयोगी होता है यदि आप किसी भिन्न ऑब्जेक्ट के ivars तक पहुंचना चाहते हैं। यदि यह स्थानीय वर्रों से इवर को अलग करने के बारे में है, तो आप बस स्थापित नामकरण योजनाओं में से एक का उपयोग कर सकते हैं (यहां विस्तार से नहीं जाएं)।

गुणों का उपयोग एक पूरी तरह से अलग कहानी है। अधिकांश मामलों में आईएमओ को सादे इवर की तुलना में गुणों का उपयोग करना पसंद करना चाहिए। स्वत: बनाए रखना एक कारण है, एक अच्छा अमूर्त दूसरा।

1

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

@interface MYObject : NSObject { 
@public // don't use this, please! 
    MYOtherObject *obj; 
} 

@property (retain) MYOtherObject *obj; 

@end 

@implementation MYObject 

@synthesize obj; 

@end 


// later in your code 

MYObject *thing = [[MYObject alloc] init]; 
MYOtherObject *other; 

// Good 
other = [thing obj]; 
other = thing.obj; 
other = [thing valueForKey:@"obj"]; // I hope my KVC is correct here. :(

// Bad, and soon to be deprecated I believe. (all members are @protected unless you use @public) 
other = thing->obj; 

यह बुरा क्यों है? आप इस तरह कार्यान्वयन फ़ाइल में सदस्यों की घोषणा कर सकते हैं: (64-बिट और iPhone)

@interface MYObject : NSObject 

@property (retain) MYOtherObject *obj; 

@end 

@implementation MYObject 

@synthesize obj = _obj; 

@end 

यहाँ, thing->obj बुला लेकिन त्रुटियों कुछ भी नहीं निकलेगा के बाद से सदस्य कार्यावधि में गतिशील रूप से आवंटित किया जाता है।

इसके अलावा, के रूप में उपयोगकर्ता @Peter Hosey बताते हैं, आप -> तरह सी ++ 'copyWithZone तथापि तरह के तरीकों में रों Friend उपयोग कर सकते हैं, अगर आप इस तरह सामान नहीं कर रहे हैं, तो दूर रहो!


[संपादित करें]

इसके अलावा, तो आप -> इस्तेमाल कर सकते हैं अगर आप वस्तु से बाहर प्रदर्शन निचोड़ की कोशिश कर रहे हैं और आपको पता क्या आपको लगता है कि वस्तु या किसी सदस्य के साथ कर रहे हैं छोड़ विधि-लुकअप का ओवरहेड। फिर भी, तथापि, तुम सिर्फ C++ या सी में उन वर्गों कोड करने के लिए करता है, तो प्रदर्शन है चाहते हो सकता है कि एक मुद्दे के बड़ा।

ओह, इसके अलावा, मुझे नहीं लगता कि -> का उपयोग थ्रेड-सुरक्षित है। यदि आपका गेटर/सेटर @synchronize का उपयोग -> का उपयोग करता है तो सुरक्षित गार्ड को बाईपास कर देगा।

+0

दरअसल, मेरा मानना ​​है कि सभी आवृत्ति चर (सदस्य) '@ निजी' के बजाय डिफ़ॉल्ट रूप से '@ संरक्षित 'हैं। – NSGod

+0

@NSGod, यह सच है। मैं संपादित करूंगा वह –

+0

यह कोड का उपयोग करता है जो मैं इसे देखकर देखता हूं हमेशा स्वयं- myvar का उपयोग कर रहा हूं। मुझे पता है कि कैसे बात-> var "बुरा" होगा लेकिन फिर, हम केवल स्वयं- myvar के बारे में बात कर रहे हैं, जो AFAIK "myvar" को कॉल करने का एक और "वर्णनात्मक" तरीका है। मुझे लगता है कि ivar को अलग करने के लिए एक "अच्छा" विकल्प एस के लिए "_myvar" का उपयोग करना होगा, लेकिन मुझे कभी सच नहीं था कि ऐप्पल का मतलब यह था कि "हमारे द्वारा उपयोग नहीं किया जाना चाहिए";) –

1

self->variable अनावश्यक है, क्योंकि आप ही इवर का जिक्र करते हुए बहुत ही प्रभाव प्राप्त करेंगे। आम तौर पर, -> ऑपरेटर काम में आता है जब बात आप उपयोग करना चाहते एक इवर में एक और उदाहरण है, जैसे है:

@implementation MyClass 

- (void) beLikeThisOtherThing:(MyClass *) foo 
{ 
someVariable = foo->someVariable; 
} 

@end