मैं इसे संश्लेषित करने के बाद निम्न संपत्ति के लिए कस्टम सेटर का उपयोग कैसे कर सकता हूं?@property के लिए कस्टम सेटर?
@property (nonatomic,retain) UIButton *but
मैं इसे संश्लेषित करने के बाद निम्न संपत्ति के लिए कस्टम सेटर का उपयोग कैसे कर सकता हूं?@property के लिए कस्टम सेटर?
@property (nonatomic,retain) UIButton *but
@property (getter=yourGetter,setter=yourSetter:) UIButton *but;
लागू @Sascha
- (void)setBut:(UIButton *)aButton;
की तरह कुछ
यह शायद दिखना चाहिए
- (void)setBut:(UIButton *)aButton {
[but release];
but = [aButton retain];
// whatever
}
लगभग सही है, लेकिन अपने कोड में यह एक छोटे से बग है;)
यह या तो दिखता है :
एक)
-(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
को किसी ऑब्जेक्ट का प्रयास करेंगे जो अब मौजूद नहीं है, जिससे क्रैश हो रहा है।
एनबी हमें विकल्प (बी) में अगर कथन की आवश्यकता नहीं है क्योंकि ऑटोरेलीज तुरंत बटन जारी नहीं करेगा, इसलिए हमारे पास इसे फिर से बनाए रखने के बिना इसे फिर से बनाए रखने का समय है।
एक बी +) वैकल्पिक समाधान 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
एक एनएसटीमर या एनएसपीओआर, एक प्रतिनिधि के लिए एक शून्य, ...
मेरा मानना है कि यह कैसे @synthesised setters यह करना है, और यह सभी परिस्थितियों में काम करता है, चाहे आप एक ही वस्तु या नहीं आवंटित की परवाह किए बिना:
- (void)setBut: (UIButton*)aButton
{
id oldObject = but;
but = [aButton retain];
[oldObject release];
}
गलत नहीं कर सकते, जहाँ तक मैं कर सकते हैं देख।
यह भी ध्यान दें कि सास्चा ने बताया कि यदि आप कस्टम सेटर प्रदान करते हैं, तो आपसे संदर्भों को रिलीज़/बनाए रखने की उम्मीद है। – devios1
ध्यान दें कि कस्टम गेटर और सेटर सामान्य चयनकर्ता की तरह है, इसलिए आपकाटर: पीछे का कॉलन होना चाहिए – onmyway133