2009-01-27 11 views
5

मैं पहले से ही जारी ऑब्जेक्ट जारी करने के इस मुद्दे में भाग रहा हूं लेकिन मेरे जीवन के लिए यह पता नहीं लगा सकता कि त्रुटि कहां हो रही है। मैंने NSZombieEnabled ध्वज जोड़ा है और यह लॉग है जो मुझे gdb में मिलता है। क्या कोई मुझे बता सकता है कि इस मुद्दे को हल करने के बारे में कैसे जाना है या यह पता लगाना कि त्रुटि कहां हुई है।आईफोन विकास - मेमोरी रिलीज इश्यू

*** -[CFString release]: message sent to deallocated instance 0x5e4780 
(gdb) where 
#0 0x952ff907 in ___forwarding___() 
#1 0x952ffa12 in __forwarding_prep_0___() 
#2 0x9260e20f in NSPopAutoreleasePool() 
#3 0x30a564b0 in _UIApplicationHandleEvent() 
#4 0x31563dea in SendEvent() 
#5 0x3156640c in PurpleEventTimerCallBack() 
#6 0x95280615 in CFRunLoopRunSpecific() 
#7 0x95280cf8 in CFRunLoopRunInMode() 
#8 0x31564600 in GSEventRunModal() 
#9 0x315646c5 in GSEventRun() 
#10 0x30a4ec98 in -[UIApplication _run]() 
#11 0x30a5a094 in UIApplicationMain() 
#12 0x00002494 in main (argc=1, argv=0xbfffef9c) at /Users/adminUser/Projects/MyProject/main.m:14 

धन्यवाद।

उत्तर

16

ऑटोरेलीज पूल पहले से जारी किए गए ऑब्जेक्ट को रिलीज़ करने का प्रयास कर रहा है।

यदि आप मैन्युअल

NSString* foo = [NSString stringWithFormat:@"foo:%d",42]; 
[foo release]; /* this release is bad, as this object is already 
registered for autorelease */ 

आप निम्न विधि का उपयोग कर सकते हैं आवंटन की बात लगता है autorelease के लिए पंजीकृत एक वस्तु जारी यह तब हो सकता:

  1. MallocStackLogging, MallocStackLoggingNoCompact वातावरण सेट 1.
  2. को
  3. प्रोग्राम चलाएं और आवंटन के स्टैक ट्रेस को खोजने के लिए शैल से malloc_history का उपयोग करने के बाद gdb 0dका उपयोग करें: malloc_history <pid> <addr>। (NSZombieEnabled gdb में पता बाहर प्रिंट होगा)

एक अन्य विकल्प (कि कम अपने क्रम प्रदर्शन को धीमा होने की संभावना है) "Zombies" टेम्पलेट के साथ उपकरण उपकरण का उपयोग करने के लिए है। यह लाश को ट्रैक करेगा और आपको malloc_history कमांड का उपयोग किए बिना ज़ोंबी का इतिहास भी बताएगा।

+0

धन्यवाद। स्मृति प्रबंधन दस्तावेज़ों के माध्यम से फिर से चला गया। मैं एक वस्तु को छोड़ने की कोशिश कर रहा था जिसका उपयोग किसी अन्य वस्तु द्वारा किया जा रहा था। – lostInTransit