2009-07-29 5 views
6

मुझे एक बरकरार/रिलीज समस्या मिली है। मेरा दृश्य बहुत जटिल है इसलिए मैंने NSZombie को YES पर सेट किया है और यह पता लगाने की कोशिश कर रहा हूं कि, वास्तव में, ऑब्जेक्ट मुझे दुःख दे रहा है। इस प्रक्रिया को गति देने के लिए मैं सोच रहा हूं कि क्या लाश को कब्र पर वापस ट्रैक करने के लिए संकेत या चालें हैं, उन्होंने जिस वस्तु से जुड़े हुए हैं, उन्हें वापस (माफ करना, था) से बाहर कर दिया था? गुप्त सांत्वना संदेश बहुत अंतर्दृष्टि प्रदान प्रतीत नहीं होता है:NSZombies मेरे ऐप के मस्तिष्क खा रहे हैं!

NSInvocation: warning: object 0x1076850 of class '_NSZombie_CALayer' does not implement methodSignatureForSelector: -- trouble ahead 

मुझे कोई चयनकर्ताओं "आगे मुसीबत" कहा जाता है।

संपादित - स्टैक ट्रेस सहित:

#0 0x3026e017 in ___forwarding___ 
#1 0x3024a0a2 in __forwarding_prep_0___ 
#2 0x302042e8 in CFRelease 
#3 0x00c4fc31 in CALayerUpdateSublayers 
#4 0x00c4e173 in -[CALayer dealloc] 
#5 0x00c4000e in CALayerRelease 
#6 0x00c48dad in CALayerFreeTransaction 
#7 0x00c410b8 in CA::Transaction::commit 
#8 0x00c492e0 in CA::Transaction::observer_callback 
#9 0x30245c32 in __CFRunLoopDoObservers 
#10 0x3024503f in CFRunLoopRunSpecific 
#11 0x30244628 in CFRunLoopRunInMode 
#12 0x32044c31 in GSEventRunModal 
#13 0x32044cf6 in GSEventRun 
#14 0x309021ee in UIApplicationMain 
#15 0x00001eb4 in main at main.m:14 

संपादित करें 2:

# Address  Category   Creation Time  Size Responsible Library Responsible Caller 
0 0x1076980 GeneralBlock-48 00:11.470  48  QuartzCore -[CALayer setDelegate:] 
1 0x1076980 CALayer   00:11.552  48  UIKit  -[UIView _createLayerWithFrame:] 

में खुदाई: ObjectAlloc

ObjectAlloc में सवाल में स्मृति पता अवलोकन किया जा रहा मैं दो मैचों को खोजने # 0 जनरलब्लॉक -48:

# Category  Event Type Timestamp Address Size Responsible Library Responsible Caller 
0 GeneralBlock-48 Malloc  00:11.470 0x1076980 48 QuartzCore -[CALayer setDelegate:] 
1 GeneralBlock-48 Free  00:11.551 0x1076980 -48 QuartzCore -[CALayer addAnimation:forKey:] 
2 CALayer   Malloc  00:11.552 0x1076980 48 UIKit -[UIView _createLayerWithFrame:] 

# 1 CALayer में खुदाई:

# Category  Event Type Timestamp Address Size Responsible Library Responsible Caller 
0 GeneralBlock-48 Malloc  00:11.470 0x1076980 48 QuartzCore -[CALayer setDelegate:] 
1 GeneralBlock-48 Free  00:11.551 0x1076980 -48 QuartzCore -[CALayer addAnimation:forKey:] 
2 CALayer   Malloc  00:11.552 0x1076980 48 UIKit -[UIView _createLayerWithFrame:] 

ठीक है, मुझे लगता है कि ड्रिलिंग गहरी या तो # 0 या # 1 में ठीक उसी जानकारी का पता चलता है अब देखते हैं। मुझे लगता है कि इसे आधे में समस्या निवारण में कटौती करनी चाहिए ... लेकिन मैं अभी भी एक नुकसान में हूं ...

+1

क्या आपने अपने आवेदन में शॉटगन प्रोग्रामिंग करने का प्रयास किया है? – Sneakyness

+1

मैंने लकड़ी के हिस्से की कोशिश की एक शॉर्टकट लिया ... हां, यह केवल NSVampires पर काम करता है :-( – Meltemi

+0

+1 प्रश्न के विवरण के लिए, और दिलचस्प शीर्षक: डी –

उत्तर

6

मेरा मानना ​​है कि बैकट्रैक सिर्फ वह बिंदु है जहां ज़ोंबी को संदेश भेजा जा रहा है। यह बैकट्रैस आमतौर पर आपको दुर्घटना का कारण बनने के बारे में शून्य जानकारी देता है। यह बहुत अधिक आपको केवल उस ऑब्जेक्ट का प्रकार और पता बताता है जिसे ओवर-रिलीज़ किया जा रहा है।

ऐसी तकनीक जिसे मैं अक्सर ओवर-रिलीज को ट्रैक करने के लिए उपयोग करता हूं, सभी रखरखाव और रिलीज़ को ट्रैक करने के लिए इंस्ट्रूमेंट्स ऑब्जेक्ट अलाल का उपयोग करना है। ऑब्जेक्टऑलोक में ओवर-रिलीज ऑब्जेक्ट के लिए पता खोजें, फिर सभी रखरखाव/रिलीज कॉल सूचीबद्ध करें, और उसके बाद रिलीज़ के साथ प्रत्येक को बनाए रखने का प्रयास करें। एक बार जब आप मैच के साथ बनाए रखने के बिना रिलीज पाते हैं, तो आपको समस्या मिल गई है।

+0

क्षमा करें, लेकिन आप कैसे उपकरण में सभी रखरखाव/रिलीज कॉल सूचीबद्ध करते हैं? – Meltemi

+1

सभी आवंटन दिखाते हुए तालिका दृश्य में, "* सभी आवंटन *" के बगल वाले तीर पर क्लिक करें। ज़ोंबी कैलियर के पते के लिए खोजें (आप इसे नीचे दिए गए खोज क्षेत्र में पेस्ट कर सकते हैं)। उस पते के बगल में तीर पर क्लिक करें। आप उस पते पर सभी मॉलोक/फ्री/रिटेन/रिलीज कॉल की एक सूची देखेंगे। प्रत्येक कॉल के लिए स्टैक ट्रेस देखने के लिए साइडबार खोलें। – kperryua

+0

धन्यवाद! सहायक! लेकिन जब मैं ऑब्जेक्टऑलोक के साथ दौड़ता हूं तो NSZombies दिखाई नहीं देते हैं। तो मैं उस पते की तुलना सूची में क्या नहीं कर सकता। मेरा मानना ​​है कि इंस्ट्रूमेंट्स डीबगर के साथ-साथ एक्सकोड के कंसोल को भी रोकता है। आह, मुझे लगता है कि मैंने अभी प्रश्न के उस हिस्से का उत्तर दिया है: Console.app में देखें और एक्सकोड के कंसोल नहीं ... – Meltemi

2

एक त्वरित चीज जो आप कर सकते हैं objc_exception_throw पर प्रतीकात्मक ब्रेकपॉइंट सेट कर दिया गया है। जब भी कोई अपवाद फेंक दिया जाता है तो यह आपके प्रोग्राम को रोक देगा। इससे आपको बिल्कुल ट्रैक करने में मदद नहीं मिल सकती है, जो CALayer आपको दुःख दे रहा है, लेकिन इसे सामान्य सामान्यता को ढूंढने में आपकी सहायता करनी चाहिए जहां इसे कहा जा रहा है।

+0

सहमत हुए, आपको यह पता होना चाहिए कि यह कब हो रहा है। –

+0

मेरे पास objc_exception_throw ब्रेकपॉइंट सक्षम था लेकिन यह मेरे लिए क्रिप्टिक जैसा है। मैंने इसे ऊपर पोस्ट कर दिया है। – Meltemi

+0

इस त्रुटि के लिए संदर्भ क्या है? आग लगने के लिए आप अपने कार्यक्रम के साथ क्या करते हैं? स्टैक ट्रेस से, ऐसा लगता है कि यह सीए लेनदेन के अंत में हो रहा है, जिसका मतलब है कि यह एक सुरक्षित शर्त है कि यह एनीमेशन के अंत में आ रहा है। क्या कोई एनीमेशन फायरिंग है? यदि हां, तो कौन सी परतें शामिल हैं? क्या आप फिर से उपयोग करने का इरादा रखने वाले 'बनाए रखने' को सुनिश्चित कर रहे हैं? – Alex

2

"आगे की परेशानी" चेतावनी का हिस्सा है, चयनकर्ता नहीं। चेतावनी स्वयं एनएसआईएनवोकेशन से आती है, लेकिन तथ्य यह है कि "कक्षा _NSZombie_CALayer" का उल्लेख है कि इसका मतलब है कि कुछ कैलियर के साथ काम करने की कोशिश कर रहा है जिसे हटा दिया गया है।

स्टैक ट्रेस इंगित करता है कि यह तब हो रहा है जब कोई परत अपने उपन्यास जारी करने की कोशिश कर रही हो।

कुल मिलाकर, इसका मतलब है कि रिलीज़ होने वाली परत में एक उपन्यास है जो आपके कोड में कहीं अधिक रिलीज़ हो गया है। कैलियर के अपने मेमोरी प्रबंधन की जांच करें, या Clang Static Analyzer आज़माएं।

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