का उपयोग किए बिना एक उद्देश्य-सी वर्ग संपत्ति सेट करना आज सुबह मैं एक आईफोन ऐप में एक दुर्घटना में भाग गया जिस पर मैं काम कर रहा हूं और जब मैंने बग तय किया है, तो मैं सिंटैक्टिक कारण के बारे में उत्सुक हूं क्योंकि यह एक समस्या थी।एक स्व-संदर्भ
मेरा कोड सरल तत्वों में कम हो गया है। मैं आइटम्स के लिए एनएसएआरएआरई का उपयोग कर टेबलव्यू में आइटम पॉप्युलेट कर रहा हूं।
@interface FooViewController : UITableViewController {
NSArray *stuff;
}
@property (nonatomic, retain) NSArray *stuff;
और मेरे कार्यान्वयन फ़ाइल में: NSArray एक संपत्ति है
@synthesize stuff;
- (void)viewDidLoad {
NSArray *arr = [[NSArray alloc] initWithObjects:@"", @"Item 1", @"Item 2",
@"Lorem", @"Ipsum", nil];
self.stuff = arr;
[arr release];
}
अब, जब मैं पहली विधि लिखा था, मैं गलती से बंद "आत्म।" छोड़ और यह बम का कारण बन गया। हालांकि परीक्षण करते समय, यह पहली बार ब्लश पर काम करता था। मैंने कोशिश की थी:
stuff = arr;
NSLog(@"%d", [stuff count]);
लेकिन बमबारी की अन्य विधियों में सामान का उपयोग कर। अब जब मैंने समस्या तय की है, तो मैं अन्य स्थानों पर [सामान गिनती] का उपयोग कर सकता हूं।
तो क्यों मैं कुछ स्थानों में सामान उपयोग कर सकते हैं, लेकिन दूसरों में मैं self.stuff का उपयोग करना चाहिए?
यदि आप गुणों का उपयोग करने जा रहे हैं, तो आपको उन्हें हर जगह उपयोग करना चाहिए, यानी डेलोक सामग्री को आसानी से पढ़ना चाहिए: self.stuff = nil; गलतियों से बचने में मदद करने के लिए एक आम तरीका उदाहरण चर को घोषित करना है: NSArray * _stuff; संपत्ति घोषणा एक ही है, लेकिन संश्लेषण कथन अब इस तरह दिखना चाहिए: @ सिंथेसाइज सामान = _stuff; अब जब भी आप स्वयं के बिना सामान का उपयोग करने का प्रयास करते हैं तो संकलक एक त्रुटि को ध्वजांकित करेगा। –
वास्तव में ऐप्पल कक्षाओं को सीधे क्लाइंट वेरिएबल्स को रिलीज़ करने की सिफारिश करता है, गुणों का उपयोग न करने के लिए - ऐसा इसलिए है क्योंकि यदि आप गुणों का उपयोग करते हैं तो आप केवीसी अधिसूचनाओं को ट्रिगर कर सकते हैं, या संभावित रूप से संश्लेषित प्राप्त/सेट विधियों को ओवरराइड करने से अन्य दुष्प्रभावों को लॉन्च कर सकते हैं। –
टिप के लिए धन्यवाद। मुझे आश्चर्य है कि यह कितना प्रासंगिक हो रहा है, खासकर जब से कोई * केवीओ ट्रिगर नहीं कर सकता है? उल्लेख नहीं है कि आधुनिक रनटाइम में हम * संश्लेषित उदाहरण चर के साथ एक्सेसर्स का उपयोग करेंगे *। मुझे लगता है कि ऐप्पल यह सुनिश्चित कर रहा है कि उनका कोड इस तरह की चीजों के खिलाफ सुरक्षा करता है। अब तक मैंने अपने कोड के साथ किसी भी समस्या में भाग नहीं लिया है, लेकिन अब मैं देख रहा हूं कि मुझे चेतावनी दी गई है :-) –