2010-11-30 7 views
5

लीकिंग मैंने कुछ समय के लिए अपने कंसोल आउटपुट को नहीं देखा है और मैंने अचानक बहुत सी अजीब त्रुटियों को देखा है।__NSAutoreleaseNoPool(): कक्षा के ऑब्जेक्ट 0x753c2f0 सामान्य जगह पर कोई पूल नहीं है - बस

__NSAutoreleaseNoPool(): Object 0x753c2f0 of class General autoreleased with no pool in place - just leaking

__NSAutoreleaseNoPool(): Object 0x753c300 of class __NSArrayM autoreleased with no pool in place - just leaking

मुझे पता नहीं कहाँ हो रहा है?

संपादित करें ..

मैं का उपयोग इस

[self performSelectorInBackground:@selector(startupStuff) withObject:sender]; 

statupStuff के साथ मैं इस

General *rdb = [[General alloc] autorelease]; 
[rdb refreshDBData]; 

त्रुटियाँ शीघ्र ही refreshDBData विधि में कोड के बाद क्या होता है।

+0

क्या आप अपने ऐप में एकाधिक थ्रेड का उपयोग कर रहे हैं? यदि ऐसा है तो यह तब होता है जब आपने थ्रेड विधि में NSAutoReleasePool नहीं रखा है। – Sanniv

+1

आपके पास पहले से ही आपका जवाब है, इसलिए यहां एक टिप्पणी है, लेकिन '+autoclease 'का आह्वान करने के बाद'autautlease' का आह्वान करना एक गलती और एक बुरी आदत है। आप '-इनिट' क्यों नहीं बुला रहे हैं? – d11wtq

उत्तर

16

Autorelease पूल धागे से बंधे हैं। यदि आप performSelectorInBackground के माध्यम से कोई थ्रेड बनाते हैं तो आपको अपने लिए एक ऑटोरेलीज पूल बनाने और नष्ट करने की आवश्यकता है। तो अगर आप की जरूरत है startupStuff इस तरह देखने के लिए:

- (void)startupStuff:(id)sender 
{ 
    NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init]; 

    // ... everything else you were doing ... 

    [pool drain]; //see comment below 
} 

अलावा: नीचे रिचर्ड का कहना है कि नाली स्वीकार करते हैं कि (डेस्कटॉप पर, अभी तक नहीं iOS पर) के लिए जारी करने के लिए आप एक कचरा कलेक्टर के साथ चल रहा हो सकता है बेहतर है बनाता है । ऐप्पल के विशिष्ट शब्द हैं (source):

एक कचरा एकत्रित वातावरण में, पूल में एक नाली संदेश भेजना आवश्यक होने पर कचरा संग्रहण ट्रिगर करता है; रिलीज, हालांकि, एक नो-ऑप है। एक संदर्भित गिनती पर्यावरण में, नाली के रिलीज के समान प्रभाव पड़ता है। आमतौर पर, इसलिए, आपको रिलीज के बजाय नाली का उपयोग करना चाहिए।

इसलिए मैंने अपना उदाहरण सही कर दिया है। कहने का पर्याप्त कारण, यह विशिष्ट सवाल आईफोन के साथ करना है और वर्तमान में उस डिवाइस पर कोई कचरा संग्रह नहीं है। तो मूल पोस्टर "नाली के रिलीज के समान प्रभाव" शिविर में है, न कि "नाली ... यदि आवश्यक हो तो कचरा संग्रह ट्रिगर करता है; हालांकि, रिलीज एक नो-ऑप" शिविर है।

General *rdb = [[General alloc] autorelease]; 

गलत है:

+1

नाली को एनएसयूयूटोरिलीपूल ऑब्जेक्ट्स के लिए रिलीज करने के लिए पसंद किया जाता है क्योंकि यह जीसी और संदर्भ-गिनती वातावरण दोनों में काम करता है। – Richard

+0

@ रिचर्ड: मुझे बताने के लिए धन्यवाद! मैं आईओएस दुनिया में बहुत लंबे समय से स्पष्ट रूप से रहा हूं। मैंने जवाब सही कर दिया है। – Tommy

+0

Thanx यह मेरे लिए भी काम किया। –

0

तो अपने काम नहीं कर भी तो आप refreshDBData विधि जांच करने की आवश्यकता .. आप कुछ देखते

4

यह गलत कर रहे हैं इस

[self performSelectorInBackground:@selector(startupStuff) withObject:sender]; 

-(void)startupStuff:(id)sender 
{ 

    NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init]; 

    General *rdb = [[General alloc] init]; 

    [rdb refreshDBData]; 

    [rdb release]; 

    [pool release]; 

} 

की कोशिश करो। हमेशा प्रारंभकर्ता को कॉल करना चाहिए; कम से कम -init पर।

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