दिलचस्प पोस्ट
एंड्रॉइड ऐप में पृष्ठभूमि का रंग कैसे बदल सकता है फ्लूइड ट्विटर बूटस्ट्रैप 2.0 में फिक्स्ड साइडबार नेविगेशन HTTP पृष्ठ से http पृष्ठ पर जाकर HTTP शीर्षलेख रेफरर क्या भेजा गया है? एकाधिक स्रोत निर्देशिकाओं के साथ मेवेन संकलित करें PHP MySQL Google चार्ट JSON – पूर्ण उदाहरण अजगर "के साथ" क्या डिज़ाइन किया गया है? पायथन का (__ कंटेंट्स_) ऑपरेटर एक बूल देता है जिसका मूल्य न तो सच्चा और न ही गलत है रोटेशन एंड्रॉइड पर गतिविधि पुनः आरंभ पूंछ- F के एक अजगर समतुल्य को कैसे लागू किया जाए? कैसे ProgressBar अद्यतनों के साथ एक BackgroundWorker को सही ढंग से लागू करने के लिए? एक 2 डी संख्यात्मक ऑब्जेक्ट सब्सकेटिंग एसक्यूएल शामिल है: एक-से-कई रिश्ते में अंतिम अभिलेख का चयन करना आर में एकल पंक्ति में एलएचएस पर कई नए चर निर्दिष्ट करें PHP में सुरक्षित यादृच्छिक संख्या पीढ़ी getActionBar शून्य प्रदान करता है

एक प्रॉपर्टी शुरू करना, डॉट नोटेशन

क्या मुझे अपने init विधियों में शून्य को गुणों को बनाए रखने के लिए डॉट नेशन का उपयोग करना एक बुरा विचार है?

इस तरह से किसी भी सामान्य संपत्ति के साथ:

@property (nonatomic, retain) id foo; 

अपने init पद्धति में कहें कि मैं self.foo = nil सेट self.foo = nil हूं। self.foo = nil संश्लेषित विधि पहले रिलीज़ या आटोरेलीज़ foo (बिल्कुल अंतर्निहित अवरोधन के बारे में बिल्कुल नहीं) क्या foo को पहली सेटर या गेस्टेर कॉल से पहले शून्य होने की गारंटी है? या यह यादृच्छिक कचरे को इंगित करेगा जब तक कि मैं स्पष्ट रूप से डॉट नेशन के बिना foo = nil सेट करता हूं?

वेब के समाधान से एकत्रित समाधान "एक प्रॉपर्टी शुरू करना, डॉट नोटेशन"

क्या मुझे अपने init विधियों में शून्य को गुणों को बनाए रखने के लिए डॉट नेशन का उपयोग करना एक बुरा विचार है?

हाँ, यह एक बुरा विचार है

1) ऑब्जेक्ट को alloc + init अनुक्रम में पहले से ही शून्य किया गया है, इसलिए इसे शून्य निरूपित करने के लिए आवश्यक नहीं है। दूसरे शब्दों में, यह कॉल बेकार है, जब तक कि आपके एक्सेसर्स पर आपके साइड इफेक्ट्स नहीं होते (एक्सेसर्स में साइड इफेक्ट भी इस चरण से बचना चाहिए)।

2) आपको आंशिक रूप से निर्मित राज्यों (जैसे init और dealloc ) में dealloc विधियों के साथ स्वयं को संदेश नहीं देना चाहिए।

# 2 के लिए कोई कारण है? मैं अक्सर स्वयं करते हैं। सरणी = [NSMutableArray सरणी]; मेरे init विधियों में

इसका कारण यह है कि आपके ऑब्जेक्ट को आंशिक रूप से निर्मित राज्यों ( init... , dealloc , finalize और many copyWithZone: implementations) के दौरान वर्ग इंटरफ़ेस के व्यवहार में दिलचस्पी नहीं लेनी चाहिए। आपके क्लास को इनिशियलाइज़ करने में दिलचस्पी लेनी चाहिए (जैसा कि init... ) और उसके बाद अपने सदस्यों (साइड-इफेक्ट्स को शुरू किए बिना ) के रूप में साफ करना चाहिए

इस उदाहरण पर विचार करें, जो आप ओएस एक्स के लिए एक फाउंडेशन टूल के रूप में बना सकते हैं:

 #import <Foundation/Foundation.h> enum { UseItTheRightWay = true -OR- false }; @interface MONObjectA : NSObject { NSMutableArray * array; } @property (nonatomic, retain) NSArray * array; @end @implementation MONObjectA @synthesize array; - (id)init { self = [super init]; if (0 != self) { NSLog(@"%s, %@",__PRETTY_FUNCTION__, self); if (UseItTheRightWay) { array = [NSMutableArray new]; } else { self.array = [NSMutableArray array]; } } return self; } - (void)dealloc { NSLog(@"%s, %@",__PRETTY_FUNCTION__, self); if (UseItTheRightWay) { [array release], array = nil; } else { self.array = nil; } [super dealloc]; } @end @interface MONObjectB : MONObjectA { NSMutableSet * set; } @end @implementation MONObjectB - (id)init { self = [super init]; if (0 != self) { NSLog(@"%s, %@",__PRETTY_FUNCTION__, self); set = [NSMutableSet new]; } return self; } - (void)dealloc { NSLog(@"%s, %@",__PRETTY_FUNCTION__, self); [set release], set = nil; [super dealloc]; } - (void)setArray:(NSArray *)arg { NSLog(@"%s, %@",__PRETTY_FUNCTION__, self); NSMutableSet * tmp = arg ? [[NSMutableSet alloc] initWithArray:arg] : nil; [super setArray:arg]; [set release]; set = tmp; } @end int main (int argc, const char * argv[]) { NSAutoreleasePool * pool = [[NSAutoreleasePool alloc] init]; [[MONObjectB new] release]; /* the tool must be named 'Props' for this to work as expected, or you can just change 'Props' to the executable's name */ system("leaks Props"); [pool drain]; return 0; } 

इस परीक्षण में व्यवहार को टॉगल करने के लिए मुख्य स्विच है UseItTheRightWay

यदि UseItTheRightWay सच है , तो हमें परिणाम दिया जाता है:

 2011-05-09 01:52:11.175 Props[45138:a0f] -[MONObjectA init], <MONObjectB: 0x10010c750> 2011-05-09 01:52:11.177 Props[45138:a0f] -[MONObjectB init], <MONObjectB: 0x10010c750> 2011-05-09 01:52:11.179 Props[45138:a0f] -[MONObjectB dealloc], <MONObjectB: 0x10010c750> 2011-05-09 01:52:11.179 Props[45138:a0f] -[MONObjectA dealloc], <MONObjectB: 0x10010c750> leaks Report Version: 2.0 Process: Props [45138] < --- snip --- > Process 45138: 1581 nodes malloced for 296 KB Process 45138: 0 leaks for 0 total leaked bytes. 

और यदि UseItTheRightWay गलत है , तो हमें परिणाम दिया जाता है:

 2011-05-09 01:55:51.611 Props[45206:a0f] -[MONObjectA init], <MONObjectB: 0x10010c750> 2011-05-09 01:55:51.614 Props[45206:a0f] -[MONObjectB setArray:], <MONObjectB: 0x10010c750> 2011-05-09 01:55:51.615 Props[45206:a0f] -[MONObjectB init], <MONObjectB: 0x10010c750> 2011-05-09 01:55:51.617 Props[45206:a0f] -[MONObjectB dealloc], <MONObjectB: 0x10010c750> 2011-05-09 01:55:51.618 Props[45206:a0f] -[MONObjectA dealloc], <MONObjectB: 0x10010c750> 2011-05-09 01:55:51.618 Props[45206:a0f] -[MONObjectB setArray:], <MONObjectB: 0x10010c750> leaks Report Version: 2.0 Process: Props [45206] < --- snip --- > Process 45206: 1585 nodes malloced for 297 KB Process 45206: 1 leak for 48 total leaked bytes. Leak: 0x100110970 size=48 zone: DefaultMallocZone_0x100005000 instance of 'NSCFSet', type ObjC, implemented in Foundation 0x70294ff8 0x00007fff 0x00001080 0x00000001 .O)p............ 0x00000001 0x00000000 0x00000000 0x00010000 ................ 0x707612a8 0x00007fff 0x00000000 0x00000000 ..vp............ 

समस्या # 1

इस उदाहरण की स्पष्ट विफलता लीक है, जो dealloc में पेश की गई है।

समस्या # 2

दूसरी चीज जो आपको काट लेंगी वह सूक्ष्म है:

 -[MONObjectA init] -[MONObjectB setArray:] -[MONObjectB init] 

यह क्या है??? -[MONObjectB setArray:] को पहले कहा जाता है -[MONObjectB init] ? इसका अर्थ है कि MONObjectB के कार्यान्वयन से पहले उपयोग किया जाता है -[MONObjectB init] , और इससे पहले -[MONObjectA init] बाहर निकल गया है। यह कोई अच्छा नहीं है = \

गैरनिष्ठवादी डिजाइन सिर्फ अवांछनीय दुष्प्रभाव, अजीब व्यवहार, लीक, और इसी तरह का एक गुच्छा पैदा करेगा। जटिल डिजाइन बहुत स्पष्ट, और बहुत सूक्ष्म तरीके से विफल हो सकते हैं जो नीचे ट्रैक करना बहुत मुश्किल हो सकता है। यह ऐसे तुच्छ लिखित अंतरों पर रखरखाव सिरदर्दों से बचने के लिए सबसे अच्छा है, और कक्षाओं को शुरू से ही उचित तरीके से लिखना (भले ही आप कुछ समय के लिए बिना किसी साइड इफेक्ट के लिए यह कर सकते थे)।