2011-07-27 10 views

उत्तर

22
@property (getter=yourGetter,setter=yourSetter:) UIButton *but; 
+0

यह भी ध्यान दें कि सास्चा ने बताया कि यदि आप कस्टम सेटर प्रदान करते हैं, तो आपसे संदर्भों को रिलीज़/बनाए रखने की उम्मीद है। – devios1

+0

ध्यान दें कि कस्टम गेटर और सेटर सामान्य चयनकर्ता की तरह है, इसलिए आपकाटर: पीछे का कॉलन होना चाहिए – onmyway133

0

लागू @Sascha

- (void)setBut:(UIButton *)aButton; 

की तरह कुछ

यह शायद दिखना चाहिए

- (void)setBut:(UIButton *)aButton { 
    [but release]; 
    but = [aButton retain]; 
    // whatever 
} 
23

लगभग सही है, लेकिन अपने कोड में यह एक छोटे से बग है;)

यह या तो दिखता है :

एक)

-(void)setBut:(UIButton *)value { 
    if (but != value) { 
     [but release]; 
     but = [value retain]; 
    } 
} 

या बी)

-(void)setBut:(UIButton *)value { 
    [but autorelease]; 
    but = [value retain]; 
} 

(ए) (बहुत) से थोड़ा अधिक कुशल, (बी) है और अधिक पठनीय है।


क्यों हम सिर्फ रिहाई & @ साशा के जवाब में बनाए रखने के बजाय विकल्प (ए) में अगर बयान की ज़रूरत है?

यदि आप एक ही ऑब्जेक्ट को दो बार पास करते हैं तो क्या होता है?

अर्थात

// We set our button for the first time 
UIButton *test = [UIButton alloc] init]; 
[self setBut:test]; 
[test release]; 


// Much later in the code, we set the button again 
[self setBut:test]; 

हम जांच नहीं किया, तो उस but एक अलग वस्तु नहीं था, पहली बात यह है कि हम अपने सेटर में करना होगा release यह है। इसके बाद हम retain को किसी ऑब्जेक्ट का प्रयास करेंगे जो अब मौजूद नहीं है, जिससे क्रैश हो रहा है।

एनबी हमें विकल्प (बी) में अगर कथन की आवश्यकता नहीं है क्योंकि ऑटोरेलीज तुरंत बटन जारी नहीं करेगा, इसलिए हमारे पास इसे फिर से बनाए रखने के बिना इसे फिर से बनाए रखने का समय है।

1

एक बी +) वैकल्पिक समाधान deanWombourne रहे हैं:

-(void)setBut:(UIButton *)value { 
    [value retain] 
    [but release]; 
    but = value; 
} 

यह समाधान मुद्दों जहां मूल्यलेकिन की एक उप-वस्तु है नहीं कर पाएगा।

एक A +) वैकल्पिक समाधान deanWombourne रहे हैं:

-(void)setBut:(UIButton *)value { 
    if (but != value) { 
     [value retain] 
     //insert here but's cancel, invalidate, delegate = nil, ... 
     [but release]; 
     but = value; 
    } 
} 

यह समाधान मुद्दों जहां मूल्यलेकिन की एक उप-वस्तु है नहीं कर पाएगा। और यह आपको एक NS12Connection के लिए cancel जोड़ने की अनुमति देगा, एक invalidate एक एनएसटीमर या एनएसपीओआर, एक प्रतिनिधि के लिए एक शून्य, ...

0

मेरा मानना ​​है कि यह कैसे @synthesised setters यह करना है, और यह सभी परिस्थितियों में काम करता है, चाहे आप एक ही वस्तु या नहीं आवंटित की परवाह किए बिना:

- (void)setBut: (UIButton*)aButton 
{ 
    id oldObject = but; 
    but = [aButton retain]; 
    [oldObject release]; 
} 

गलत नहीं कर सकते, जहाँ तक मैं कर सकते हैं देख।

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