2008-10-07 15 views
14

मेरे पास खुश वस्तुओं के साथ NSMutableArray एक सरणी है। जब भी मैं सभी वस्तुओं की सरणी को साफ़ करने और इसे दोबारा बनाने की कोशिश करता हूं, तो ये वस्तुएं मुझे (लीक) चालू कर देती हैं।एनएसएमयूटेबलएरे विनाश

यह इतना

self.list = [NSMutableArray array]; 

तरह init समारोह में आवंटित है विभिन्न तरीकों मैं इसे बाहर खाली करने के लिए इस्तेमाल किया है में शामिल हैं:

self.list = nil; 
self.list = [NSMutableArray array]; 

और

[self.eventList removeAllObjects]; 

स्पष्ट रूप से आवंटन और रिहा सरणी या तो काम नहीं करता है। रिसाव केवल तब होता है जब मैं सूची को रीसेट करने का प्रयास करता हूं।

क्या मुझे रीसेट करने पर एक कदम याद आ रहा है या यह एक अलग समस्या है?

उत्तर

9

आपने लीक करने वाली वस्तुओं को कैसे बनाया? आप कुछ इस तरह किया है:

- (void)addObjectsToArray { 

    [list addObject:[[MyClass alloc] init]; 

    OtherClass *anotherObject = [[OtherClass alloc] init]; 
    [list addObject:anotherObject]; 
} 

तो आप दो वस्तुओं जब सूची पुनः आवंटित की जाती है रिसाव हो जाएगा।और अधिक विस्तार में

- (void)addObjectsToArray { 

    MyClass *myObject = [[MyClass alloc] init]; 
    [list addObject:myObject]; 
    [myObject release]; 

    OtherClass *anotherObject = [[OtherClass alloc] init]; 
    [list addObject:anotherObject]; 
    [anotherObject release]; 
} 

:

आप के साथ किसी भी तरह के कोड बदल दिया जाना चाहिए

आप पहली बार पैटर्न का पालन करते हैं, तो आप दो वस्तुओं जो, Cocoa memory management rules के अनुसार आप ही बना लिया है। स्वामित्व को छोड़ना आपकी ज़िम्मेदारी है। यदि आप नहीं करते हैं, तो ऑब्जेक्ट को कभी भी हटाया नहीं जाएगा और आपको एक रिसाव दिखाई देगा।

आपको तुरंत रिसाव दिखाई नहीं देता है, हालांकि, क्योंकि आप ऑब्जेक्ट को सरणी में पास करते हैं, जो उनके स्वामित्व भी लेता है। रिसाव केवल तब पहचाना जाएगा जब आप सरणी से ऑब्जेक्ट को हटाते हैं या जब सरणी स्वयं को हटा दी जाती है। जब इनमें से कोई भी घटना होती है, तो सरणी वस्तुओं के स्वामित्व को छोड़ देती है और उन्हें आपके आवेदन में "लाइव" छोड़ा जाएगा, लेकिन आपके पास उनके कोई संदर्भ नहीं होंगे।

4

आपकी @property घोषणा क्या दिखती है? क्या आप एक्सेसर्स को संश्लेषित कर रहे हैं? यदि ऐसा है, तो आपको @property(retain) की आवश्यकता है। मुझे लगता है कि जब आप कहते हैं कि ऑब्जेक्ट्स आप पर मोड़ रहे हैं, तो आप कोर डंप (EXC\_BAD\_ACCESS) का जिक्र कर रहे हैं।

+0

@property (nonatomic, retain) एनएसएमयूटेबलएरे * सूची; मेरे पास एक संश्लेषण है, लेकिन कोर डंप केवल तब होता है जब मैं ऑब्जेक्ट को मैन्युअल रूप से रिलीज़ करने का प्रयास करता हूं। मेरा मतलब है कि मुझे चालू करने का मतलब है लीकिंग ऑब्जेक्ट्स (मुझे लगता है) – SageAMDP

+0

आप कैसे जानते हैं कि वे लीक हो रहे हैं? क्या आप उपकरण \ लीक की जांच कर रहे हैं? यदि आपको बुरी पहुंच मिल रही है, तो इसका मतलब है कि आप कुछ ऐसा जारी कर रहे हैं जो पहले ही अस्वीकृत है। लीक को इस अर्थ में खोजना कठिन होता है कि आपको उन्हें पकड़ने के लिए एक उपकरण का उपयोग करने की आवश्यकता होती है (या बस अपनी याददाश्त बढ़ती है)। – Elfred

+1

इसलिए, यदि आप [सूची addObject: [[MyObj alloc] init] कर रहे हैं; और बाद में [सूची हटाएंऑल ऑब्जेक्ट्स]; आप शायद लीक कर रहे हैं। समाधान एक क्लास विधि प्रदान करना होगा जो एक ऑटोरेलेज्ड ऑब्जेक्ट देता है। – Elfred

6

क्या आप सरणी लीकिंग में ऑब्जेक्ट्स का जिक्र कर रहे हैं?

आप सरणी में ऑब्जेक्ट्स कैसे जोड़ रहे हैं? सरणी उन्हें बनाए रखेगी, इसलिए आपको उन्हें सरलीकृत करने या उन्हें सरणी में जोड़ने के बाद उन्हें रिलीज़ करने की आवश्यकता है। अन्यथा सरणी जारी होने के बाद वस्तुओं को अभी भी बनाए रखा जाएगा (लीक)।

MyEvent *event = [[MyEvent alloc] initWithEventInfo:info]; 
[self.eventList addObject:event]; 
[event release]; 

MyEvent *otherEvent = [[[MyEvent alloc] initWithEventInfo:otherInfo] autorelease]; 
[self.eventList addObject:otherEvent]; 
+0

- (शून्य) addEventToList: (घटना *) में { \t [self.list addObject: inEvent]; \t \t [इनवेंट रिलीज]; } ऑब्जेक्ट पास किया गया ऑब्जेक्ट बनाया गया है ई यह [[घटना आवंटन] init]; – SageAMDP

+0

जो भी गुजर रहा है उसे छोड़ देना चाहिए, कोड को पारित नहीं किया जाना चाहिए। किसी ऑब्जेक्ट को रिहा करना जिसे आप नहीं जानते हैं, वह खराब है। –

+0

हर बार जब भी मैं सरणी को साफ़ करने का प्रयास करता हूं तब भी मुझे रिसाव होता है। कभी अजीब बात है। मुझे वह तरीका मिला है जो इसे पारित होने के बाद इसे जारी करने वाला ईवेंट बनाता है। सब कुछ सरणी में सभी वस्तुओं को हटाए बिना ठीक काम करता है। – SageAMDP

0

मैं कहूंगा कि मेरे पास वास्तव में एक महान उत्तर देने के लिए पर्याप्त जानकारी नहीं है। क्या आप कह रहे हैं कि NSMutableArray अभी भी आवंटित है, लेकिन खाली है और इसमें कोई ऑब्जेक्ट नहीं है लेकिन ऑब्जेक्ट में एक बार पहले ऑब्जेक्ट्स आवंटित किए गए हैं, भले ही उन्हें ऐप में उस बिंदु पर डिलीक किया जाना चाहिए?

यदि ऐसा है तो सरणी संभवतः खाली हो सकती है, लेकिन आपकी ऑब्जेक्ट्स उन्हें भेजे गए डेलोक संदेश को प्रबंधित नहीं कर रही हैं, इस स्थिति में ऑब्जेक्ट्स अभी भी स्मृति में हैं लेकिन किसी भी चीज़ द्वारा संदर्भित नहीं हैं।

मैं आपकी मदद करने के लिए कहूंगा कि मैं वास्तव में जानना चाहता हूं कि मॉलोकडेबग वास्तव में क्या कह रहा है। इसके अलावा @Elfred सरणी के लिए @property विधि की जांच करने में कुछ अच्छी सलाह दे रहा है, वास्तव में इसे बनाए रखना या प्रतिलिपि बनाना चाहिए।

0

यदि लीक केवल तभी होती है जब आप सूची को रीसेट करने का प्रयास करते हैं, तो आपके पास उन अन्य ऑब्जेक्ट्स का उपयोग करके कोई और कुछ है जिसे आपने अभी रिलीज़ करने का प्रयास किया था।

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