6

जब मैं अपना एप्लिकेशन चलाता हूं, जो ज़ोंबी सक्षम के साथ एक्सकोड 4.5.1 (एलएलडीबी) डीबगर में एआरसी का उपयोग नहीं करता है, तो मुझे यह त्रुटि दो बार (2) मिलती है - [सुपर डेलोक] (- [NSObject dealloc]) :मैं xcode 4.5 w/o एआरसी के साथ ज़ोंबी त्रुटि से कैसे बचूं?

* - [V2APIClient वर्ग]: deallocated उदाहरण के लिए भेजे गए संदेश 0x9d865c0 * - [V2APIClient वर्ग]: जब मैं xcode 4.4.1 में एक ही एप्लिकेशन को चलाने के deallocated उदाहरण 0x9d865c0

को भेजे गए संदेश (एलएलडीबी) डीबगर, मुझे एक बार त्रुटि संदेश मिलता है (1)। जब मैं एक्सकोड 4.3.2 में उसी एप्लिकेशन के थोड़ा पहले संस्करण चलाता हूं, तो मुझे त्रुटि संदेश बिल्कुल नहीं मिलता है (0)। मैं इसे एक ही/नवीनतम कोड के साथ पुनः प्रयास करूंगा। -

FYI करें यह ठीक इस अन्य पोस्ट है, जो अभी तक उत्तर नहीं किया गया है के रूप में एक ही समस्या हो गया लगता है: -[Foo class]: message sent to deallocated instance on [super dealloc])

मैं एक ही सवाल दो बार reposting से बचने के लिए प्रयास किया, लेकिन मैं आगे बढ़ने के लिए सलाह दी गई थी: https://meta.stackexchange.com/questions/152226/avoiding-asking-a-question-thats-already-been-asked

इसके अलावा, मैं भी सिर्फ एप्पल डेवलपर फ़ोरम में बराबर प्रश्न पूछा: https://devforums.apple.com/thread/171282

अंत में, यहाँ मेरी कक्षा का सार है:

@interface ASIHTTPRequestHandler : NSObject { 
    id _error; 
} 
@property (nonatomic,retain) id error; 
@end 

@implementation ASIHTTPRequestHandler 
@synthesize error = _error; 
-(id)init 
{ 
    self = [super init]; 
    if (self) 
    { 
     self.error = nil; 
    } 
    return self; 
} 

-(void)dealloc 
{ 
    self.error = nil; 
    [super dealloc];// this is the line that appears to cause the problems 
    } 
    @end 

कृपया इस समस्या को हल करने में मेरी सहायता करें। मुझे विश्वास नहीं है कि मैं किसी भी मेमोरी प्रबंधन नियमों का उल्लंघन कर रहा हूं, लेकिन यह त्रुटि अन्यथा इंगित करती है। जब तक मैं इस समस्या को हल नहीं कर सकता तब तक मुझे किसी भी नए कोड में जांच करने में संकोच नहीं होता है।

धन्यवाद, चक

पी.एस.

PanoTourMgrAppDelegate *ptmAppDlgt = [PanoTourMgrAppDelegate getApplicationDelegate]; 
Settings *settings = ptmAppDlgt.settings; 
Identification *identification = ptmAppDlgt.identification; 
V2APIClient *v2ApiClient = [[V2APIClient alloc] initWithSettings:settings identification:identification]; 
NSDictionary *result = [v2ApiClient get_application_status]; 
BOOL success = [v2ApiClient callWasSuccessful:result]; 
if (!success) 
{ 
    id error = v2ApiClient.error; 
    NSString *mbTitle = nil; 
    NSString *mbMessage=nil; 
    if ([error isKindOfClass:[NSString class]]) 
    { 
     mbTitle = @"Application version no longer suppported"; 
     mbMessage = (NSString*)error; 
     [MessageBox showWithTitle:mbTitle message:mbMessage]; 
    } 
} 
[v2ApiClient release]; // This is the line that indirectly causes the messages above 
+1

'[ऑब्जेक्ट बरकरार रखें]; –

+0

समस्या उपर्युक्त कोड का नतीजा होने की संभावना नहीं है, बल्कि आप ऑब्जेक्ट को 'आवंटित' /' init 'कैसे करते हैं और आप अंत में इसे कैसे रिलीज़ करते हैं। जब तक आप कुछ अजीब नहीं कर रहे हैं, तो इसे रिलीज़ करने का एक साधारण मामला होना चाहिए। जबकि H2CO3 का सुझाव मनोरंजक है, मुझे यकीन है कि वह अंधेरे से 'रखरखाव' बयान डालने का सुझाव नहीं दे रहा है, क्योंकि जब तक कि आप अपने भाग्यशाली भाग्यशाली न हों, तो आप ओवर-रिलीज़ के बजाए लीक के साथ समाप्त हो जाएंगे। आपको केवल 'retainCount'' को बढ़ाने के लिए 'retainCount' की उचित रिलीज के द्वारा ऑफ़सेट किया गया है, यह सुनिश्चित करने की ज़रूरत है कि यह सुनिश्चित करने की आवश्यकता है। – Rob

उत्तर

3

आप एक deallocated उदाहरण के संदेश रहे हैं, तो ऐसा इसलिए है क्योंकि आप स्मृति सही ढंग से प्रबंधित नहीं किया है: रिकॉर्ड के लिए, यहाँ बुला कोड है। आपके पास रिहाई है जो बरकरार रखी नहीं है; एक ओवर-रिलीज

सबसे पहले, अपने कोड पर "निर्माण और विश्लेषण करें" करें। पहचान की गई किसी भी समस्या को ठीक करें।

अगला, ज़ोंबी पहचान सक्षम के साथ उपकरण के तहत चलाएं और संदर्भ गणना ट्रैकिंग सुविधा चालू करें। फिर, जब यह दुर्घटनाग्रस्त हो जाता है, तो प्रश्न में ऑब्जेक्ट को सभी बनाए रखने/रिलीज़ ईवेंट का निरीक्षण करें। आपको एक अतिरिक्त रिलीज मिलेगी। चुनौती है कि रिहाई को संतुलित करने के लिए सही जगह पर बने रहें।

(और के रूप में रोब ठीक ही बताते हैं, यह बस एक अतिरिक्त कॉल जारी करने के लिए का मामला हो सकता है।)

+0

मैंने एक निर्माण और विश्लेषण किया है, और मैंने पहचान की सभी समस्याओं को ठीक कर दिया है। –

+0

फिर आपने "अगला" भाग किया था? "निर्माण और विश्लेषण" के लिए – bbum

+1

+1। "चुनौती है कि रिहाई को संतुलित करने के लिए सही स्थान पर बने रहें", मैं सहमत हूं। लेकिन कभी-कभी बातचीत सच है, कि आपको अपने बाहरी 'रिलीज' को हटा देना चाहिए। कुंजी यह है कि उन्हें संतुलित होने की आवश्यकता है। (मुझे पता है कि आप जानते हैं कि bbum, लेकिन मैं इसे @ChuckDoucette के लाभ के लिए कहता हूं।) – Rob

1

यह Xcode के कुछ संस्करणों में डीबगर में एक बग है।

मैंने इसे एक्सकोड 4.4.1 में अभी किया है लेकिन यह एक्सकोड 4.6 में नहीं है। बग का प्रयोग करने के लिए मैंने एक नया "सिंगल व्यू एप्लिकेशन" प्रोजेक्ट बनाया, स्कीम डायलॉग में "ज़ोंबी ऑब्जेक्ट्स सक्षम करें" पर स्विच किया, और अंतिम पंक्ति पर सेट ब्रेक पॉइंट के साथ व्यू कंट्रोलर में निम्न कोड चलाया।

- (void)viewDidLoad { 
    [super viewDidLoad]; 

    NSObject *object = [[NSObject alloc] init]; 
    [object release]; 

} 

यह डिबगर में निम्न संदेश में परिणाम:

- [NSObject वर्ग]: संदेश deallocated उदाहरण के लिए भेजा 0x6a7e330

तुम भी चर में वस्तु को देख सकते हैं डीबगर का अनुभाग अब इसकी कक्षा को _NSZombie_ के रूप में वर्णित करता है। यदि आप ब्रेकपॉइंट को हटाते हैं तो संदेश अब नहीं दिखाया जाता है। ऑब्जेक्ट सही तरीके से हटाए जाने के बाद class विधि पर कॉल डीबगर द्वारा बनाई गई है।

+0

वाह। साफ! अच्छा खोज – bbum