चाप के साथ ओवरराइड सेटर


108
@interface Article : NSObject 

@property (nonatomic, strong) NSString *imageURLString;

@end


@implementation Class

@synthesize imageURLString = _imageURLString;

- (void)setImageURLString:(NSString *)imageURLString {
    _imageURLString = imageURLString;
    //do something else
}

क्या ARC सक्षम होने पर मैंने सेटर को सही ढंग से ओवरराइड किया?


2
हां, यह मुझे सही लगता है। यह काम कर रहा है कि आप कैसे उम्मीद करते हैं या नहीं?
रोबिन समरहिल

जवाबों:


89

हां यह सही है। मुझे भरोसा करने में थोड़ा समय लगा कि यह वास्तव में सही काम है।

आपको एहसास है कि इस मामले में, ओवरराइड आवश्यक नहीं है क्योंकि आप मानक उत्पन्न से अधिक नहीं करते हैं सेटर क्या करेगा? यदि आप अधिक कोड जोड़ते हैं तो ही आपको setImageURLString:सेटर को ओवरराइड करने की आवश्यकता होगी।


6
हाँ। मुझे इसका एहसास है। मैं टिप्पणी जोड़ता हूं कि मैं अपना अतिरिक्त कोड कहां जोड़ना चाहता हूं। उत्तर के लिए बहुत बहुत धन्यवाद।
रोविंगमैन

4
आप जानते हैं कि एक दिलचस्प प्रयोग क्या होगा? टिप्पणी का रंग बदलना (SO और अन्य साइटों और IDE में) ... आमतौर पर यह हल्का ग्रे या कुछ और होता है जो बाहर नहीं खड़ा होता है। # ff0000 शायद? क्या इससे कोई फर्क पड़ेगा? जब तक हम विशेष रूप से कुछ चीज़ों को कैसे घटाते हैं, इस बात के लिए प्रोग्रामर का उपयोग किया जाता है, जब तक कि हम कुछ काम करने की कोशिश नहीं करते हैं, उस स्थिति में हम उन्हें कभी-कभी अनदेखा कर देते हैं।
3

68

@ पास्कल द्वारा दिए गए उत्तर पर विस्तार करते हुए मैं यह जोड़ना चाहूंगा कि यह निश्चित रूप से सही काम है और आप यह देख कर देख सकते हैं कि कोड क्या संकलन करता है। मैंने एक ब्लॉग पोस्ट लिखा कि कैसे चेकिंग के बारे में जाना जाए, लेकिन मूल रूप से वह कोड नीचे (ARMv7) के लिए संकलित है:

        .align  2
        .code   16
        .thumb_func     "-[Article setImageURLString:]"
"-[Article setImageURLString:]":
        push    {r7, lr}
        movw    r1, :lower16:(_OBJC_IVAR_$_Article._imageURLString-(LPC7_0+4))
        mov     r7, sp
        movt    r1, :upper16:(_OBJC_IVAR_$_Article._imageURLString-(LPC7_0+4))
LPC7_0:
        add     r1, pc
        ldr     r1, [r1]
        add     r0, r1
        mov     r1, r2
        blx     _objc_storeStrong
        pop     {r7, pc}

नोट कॉल करने के लिए _objc_storeStrongजो LLVM के अनुसार इस करता है:

id objc_storeStrong(id *object, id value) {
    value = [value retain];
    id oldValue = *object;
    *object = value;
    [oldValue release];
    return value;
}

तो, आपके प्रश्न का उत्तर देने के लिए, हाँ यह सही है। एआरसी ने पुराने मूल्य के सही रिलीज और नए मूल्य को बनाए रखने में जोड़ा है।

[संभवत: जटिल उत्तर पर, लेकिन सोचा कि यह दिखाना उपयोगी है कि आप भविष्य में इस तरह के एआरसी से संबंधित प्रश्न का उत्तर कैसे दे सकते हैं]


1
इसके लिए धन्यवाद, मैं अपने कोड (और इस उत्तर) का दूसरा अनुमान लगा रहा था, लेकिन आपने मेरे डर को शांत करने के लिए रखा है।
२०:४

1
धन्यवाद मैट। यह 43 वाँ मतदाता होने के नाते सही नहीं लगा, क्योंकि 42 को इस उत्तर के लिए इतनी अच्छी वोटिंग लगती थी।
बेम्यूटर

1
यदि संपत्ति को कॉपी करने के लिए सेट किया गया है तो क्या होगा? उदाहरण के लिए @property (nonatomic, copy) UIColor * lineColor ;; सेटर के अंदर, क्या मैं सिर्फ _lineColor = input कर सकता हूं; या मुझे _lineColor = [इनपुट कॉपी] करना है?;
डैनियल टी।

1
@DanielT। आपको करना होगा _lineColor = [input copy];, हाँ।

-10

कॉल

[super setImageURLString:theString];

बस


1
सुपरक्लास में सेटइमेजुरलस्ट्रिंग के कार्यान्वयन की संभावना नहीं है:
विल मैकाले

अगर यह किया भी, यह शायद आप ऐसा करना चाहते हैं सामान नहीं करना होगा।
नैट सीमर
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.