2010-03-04 11 views
18

पुनः आवंटित की जाती जब भी मैं अपने ढेर पर एक दृश्य नियंत्रक धक्का, तो यह बंद पॉप करने के लिए भेजा है, मैं इस त्रुटि मिलती है पॉप अप बंद और केवल इस दृश्य नियंत्रक के लिए विशिष्ट है। मुझे यकीन है कि कैलियर के पास दृश्य के साथ कुछ करना है, क्योंकि मैं उनका उपयोग नहीं करता हूं।उदाहरण

कोई विचार?

संपादित करें: यहाँ पश्व-अनुरेखन

(gdb) bt 
#0 0x01fcd3a7 in ___forwarding___() 
#1 0x01fa96c2 in __forwarding_prep_0___() 
#2 0x01fc10e8 in CFGetRetainCount() 
#3 0x01cbc770 in CA::release_root_if_unused() 
#4 0x01cbc707 in x_hash_table_remove_if() 
#5 0x01cbc4ec in CA::Transaction::commit() 
#6 0x01cc4838 in CA::Transaction::observer_callback() 
#7 0x01fa5252 in __CFRunLoopDoObservers() 
#8 0x01fa465f in CFRunLoopRunSpecific() 
#9 0x01fa3c48 in CFRunLoopRunInMode() 
#10 0x027dd615 in GSEventRunModal() 
#11 0x027dd6da in GSEventRun() 
#12 0x0057cfaf in UIApplicationMain() 
#13 0x00002dec in main (argc=1, argv=0xbfffeed0) 
+1

कृपया कोड पोस्ट करें जहां आपको यह दुर्घटना हो रही है। और यदि आप जानते हैं कि NSZombieEnabled ब्रेकपॉइंट का उपयोग कैसे करें, तो इसका उपयोग करें, आपको यह पता चल जाएगा कि हमारे दुर्घटना का कारण क्या हो सकता है। – Manjunath

+2

@ मॅन: "संदेश को आवंटित उदाहरण पर भेजा गया" का अर्थ है ज़ोंबी पहले ही सक्षम है। – kennytm

+0

समस्या यह है कि कोई कोड नहीं है जहां यह दुर्घटनाग्रस्त हो जाता है, मैं बैकट्रैक कर सकता हूं। – skylerl

उत्तर

0

है मैं एक चुपके संदेह यह ऑटो रिहाई पूल के साथ क्या करना है ...

12

मैं इसी तरह की समस्या हुई है, पता चला कि मैं यूआईबटन को ठीक से नहीं रख रहा था। मैं कैसे कारण नहीं पाया: - लाश सक्षम करें - 'आवंटन' साधन के साथ इस परियोजना चलाने के लिए - बग को गति प्रदान करने एप्लिकेशन का उपयोग करें - जांच करें कि उपकरण शो संदेश 'ज़ोंबी संदेश भेजा' समय पर - वहाँ एक लिंक होना चाहिए जो कैलियर विवरण खोलता है: जब इसे आवंटित किया गया था और को आवंटित किया गया था - आपको आवंटित स्थान पर रुचि है, तो वह होना चाहिए !!! अपने कोड में रखें

शुभकामनाएँ!

+0

मैंने यह किया है और वह लाइन जहां यह कहती है कि कैलियर मॉलोकैड था [[एनएसबंडल मेनबंडल] loadNibNamed @ "..." 'आदि। जो वास्तव में मदद नहीं करता क्योंकि मैं कई बार उस नीब से गुजर चुका हूं और कुछ भी दो बार dealloc'd किया जा रहा है। –

4

मुझे एक समान समस्या थी। मेरी समस्या यह थी कि इंटरफ़ेस में घोषित ऑब्जेक्ट वेरिएबल्स में से एक को गलती से (nonatomic, assign) के साथ घोषित किया गया था और (nonatomic, retain) जैसा नहीं होना चाहिए था। इसने 0 (= क्रैश) की एक गिनती गिनती के साथ पहले से ही किसी ऑब्जेक्ट को रिलीज़ संदेश भेजा था।

7

यह थोड़ा सा मुश्किल है, मेरी कक्षाओं में से एक (एम/xib) के एक डेलोक फ़ंक्शन में एक डबल रिलीज थी, जिसमें मैंने पंक्ति शैली के रूप में एक टेबलव्यू में था। उपकरण ने ऑब्जेक्ट के बारे में बहुत कुछ नहीं दिखाया, लेकिन कॉलस्टैक की जांच वास्तव में यह निर्धारित करने में सहायक थी कि कौन सी कक्षा 1 पर जा रही थी।

Sample

+0

जब आप कहते हैं कि यह कक्षाओं में से एक (एम/xib) के एक डेलोक समारोह में एक डबल रिलीज था, तो क्या आपका मतलब है कि आप एम फाइल में और XIB फ़ाइल में भी रिलीज़ हो रहे थे? मैं ' मेरे पास एक समान समस्या है - UIView इसके कस्टम UIView सबक्लास के साथ एक एक्सआईबी के माध्यम से लोड किया गया है। मेरे UIView सबक्लास में मैं एक संपत्ति को हटा रहा हूं और यह आपके पास एक ही त्रुटि के साथ दुर्घटनाग्रस्त हो जाता है। अगर मैं इसे टिप्पणी करता हूं, तो सब कुछ ठीक है। क्या यह संभव है एक XIB में भी dealloc करने के लिए? –

+0

मैं इस त्रुटि में भाग गया और यह आईबीओलेट को दो बार रिलीज़ होने के कारण भी था। [myLabel रिलीज] की तरह लग रहा था; [myLabel रिलीज]; (सचमुच एक दूसरे के बगल में सही)। इसका सबसे अच्छा अभ्यास रिलीज के बाद परिवर्तनीय को शून्य पर असाइन करें, जो यहां या नहीं किया गया था ई त्रुटि प्रकट नहीं होती। ट्रैक करने के लिए मुश्किल है, लेकिन सौभाग्य से इस दृश्य नियंत्रक के लिए कोड बहुत छोटा था। – Sam

+0

यह बहुत उपयोगी है। धन्यवाद। – teepusink

3

मैं एक ही त्रुटि थी और क्योंकि मैं buttonWithType (जैसे [UIButton buttonWithType:UIButtonTypeRoundedRect]) का उपयोग कर एक UIButton बनाया है और वह बाद में जारी किया गया था। यह गलत था क्योंकि buttonWithType पहले से ही autorelease शामिल है। तो मैंने अपना release हटा दिया और त्रुटि चली गई।

0

मुझे एक ही त्रुटि मिल रही थी। मैंने UIView ऑब्जेक्ट को दो बटन रखने के लिए बनाया, जिसे मैंने अपने नेविगेशन आइटम के rightBarButtonItem में जोड़ा। समस्या यह है कि मैंने बटन बनाने के लिए कारखाने buttonWithType विधि का उपयोग किया, लेकिन मैं सिर्फ alloc और initWithFrame मेरा विचार। फिर, जब मैंने दृश्य के साथ किया, तो मैं इसे जारी कर रहा था और बाद में, जब सिस्टम दो बटनों को रिलीज़ करने की कोशिश कर रहा था (पहले से जारी UIView के सबव्यूज़) - क्रैश - यह पहले से रिलीज़ किए गए बटन पर एक संदेश भेज रहा था। उम्मीद है कि किसी को भी इसी तरह की परेशानी पर कुछ समय बचाने में मदद मिलेगी।

+1

आप इसे कैसे अनुमान लगाते हैं? –

1

कौन सा दृश्य ट्रैक करना वास्तव में उपयोगी है! यह बहुत छोटा हो सकता है यदि आप फ्रेम जानते हैं और कौन से सुपरलेयर और सब्लेयर उस दृश्य से संबंधित हैं ... यदि आप सभी परतों को लॉग करते हैं तो यह वही स्मृति पता खोजने और खोजने के लिए है। सौभाग्य!

#import "CALayer+debug.h" 

@interface CALayer (Debug) 

-(NSString*)debugDescription; 
-(NSString*)debugLayerTree; 

@end 

श्रेणी-कार्यान्वयन::

#import <Foundation/Foundation.h> 
#import <QuartzCore/QuartzCore.h> 
#import "CALayer+debug.h" 
#import <UIKit/UIKit.h> 
#import <objc/runtime.h> 
#import <objc/message.h> 


@implementation CALayer (Debug) 

//.... 

void Swizzle(Class c, SEL orig, SEL new) 
{ 
    Method origMethod = class_getInstanceMethod(c, orig); 
    Method newMethod = class_getInstanceMethod(c, new); 
    if(class_addMethod(c, orig, method_getImplementation(newMethod), method_getTypeEncoding(newMethod))) 
     class_replaceMethod(c, new, method_getImplementation(origMethod), method_getTypeEncoding(origMethod)); 
    else 
     method_exchangeImplementations(origMethod, newMethod); 
} 

+ (void)swizzle { 
    Swizzle([self class], @selector(init), @selector(newInit)); 
} 

- (id)newInit { 
    self = [self newInit]; 

    [self performSelector:@selector(log) withObject:self afterDelay:0.5]; 

    return self; // calls old method 
} 

- (void)log { 
    NSLog(@"%@", [self debugDescription]); 
} 

- (NSString *)debugDescription { 
    return [NSString stringWithFormat:@"%@ frame=%@ zAnchor=%1.1f, superlayer: %@>", [self description], NSStringFromCGRect(self.frame), self.zPosition, self.superlayer]; 
} 


@end 

उदा से कॉल :)

आपके आवेदन

श्रेणी-हैडर के लिए इस श्रेणी में जोड़ें appdelegate

[CALayer swizzle]; 
+0

यह वास्तव में डीबग करने का एक शानदार तरीका है। धन्यवाद! – nonamelive

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