11

मूलभूत हैं मेरे पास कस्टम NSURLProtocol है। startLoading में, [self client] प्रकार का है:जीएन पर्यावरण में कस्टम NSURLProtocol में _NSCFURLProtocolBridge में संदर्भ गणना अंडरफ़्लो से कैसे बचें

<_NSCFURLProtocolBridge> {NSURLProtocol, CFURLProtocol} 

समस्या एक कचरा-एकत्र वातावरण में इस चल रहा है। क्योंकि मैं एक स्क्रीनसेवर लिख रहा हूं, मुझे इसे कचरा इकट्ठा करने के लिए मजबूर किया गया है। हालांकि, _NSCFURLProtocolBridge प्रोटोकॉल हमेशा फेंक लगता है:

malloc: reference count underflow for (memory_id_here), break on auto_refcount_underflow_error to debug

एक उदाहरण डिबग कंसोल के लिए डंप है:

ScreenSaverEngine[1678:6807] client is <_NSCFURLProtocolBridge 0x20025ab00> {NSURLProtocol 0x200258ec0, CFURLProtocol 0x20029c400} ScreenSaverEngine(1678,0x102eda000) malloc: reference count underflow for 0x20025ab00, break on auto_refcount_underflow_error to debug.

आप देख सकते हैं किके लिए अंडरफ्लो होता है।

जब मैं auto_refcount_underflow_error पर तोड़ने, यह ढेर का पता लगाने के लिए वापस ऊपर में URLProtocolDidFinishLoading: लगता है:

id client = [self client]; 
... 
[client URLProtocolDidFinishLoading:self]; 

यह समस्या थोड़ी देर के लिए ही अस्तित्व में है लगता है, लेकिन वहाँ सभी ऑनलाइन पर कोई जवाब नहीं प्रतीत हो रहा है:

http://lists.apple.com/archives/cocoa-dev/2008/May/msg01272.html http://www.cocoabuilder.com/archive/message/cocoa/2007/12/17/195056

बग केवल इन सूचीबद्ध कीड़े के लिए कचरा-एकत्र वातावरण के साथ-साथ में ही पता चलता है। मेमोरी के मुद्दों के बिना मैं इस बारे में कोई विचार कैसे कर सकता हूं? मुझे लगता है कि यह शायद NSURLProtocol के नीचे सीएफ प्रकार के साथ कुछ करने के लिए अनुचित रूप से जारी किया जा रहा है?

+0

स्टैक ट्रेस की एक तस्वीर: http://img.skitch.com/20090711-qbt4s4jq87jk4g68iaawe7h1hg.png –

उत्तर

4

अंतिम WWDC हम एक वेबकिट इंजीनियर के साथ इस बग की पुष्टि की है, वह इसलिए उम्मीद है कि कोड में वहीं बग देख सकते हैं कि वे इसे ठीक कर देंगे। कामकाज क्लाइंट को initWithRequest विधि में CFRetain करना है।

- (id)initWithRequest:(NSURLRequest *)request cachedResponse:(NSCachedURLResponse *)cachedResponse client:(id <NSURLProtocolClient>)client 
{ 
    // work around for NSURLProtocol bug 
    // note that this leaks! 
    CFRetain(client); 

    if (self = [super initWithRequest:request cachedResponse:cachedResponse client:client]) 
    { 
    } 

    return self; 
} 
1

यह त्रुटि आम तौर पर इंगित करती है कि एक वस्तु -retain के साथ बनाए रखा गया था, लेकिन CFRelease() के साथ जारी किया गया था। अगर आपको लगता है कि यह आपकी वस्तु नहीं हो सकती है (और यह एक भयानक धारणा नहीं है), तो आपको एक और रडार खोलना चाहिए। लेकिन आपको सबसे पहले देखना चाहिए और देखें कि कोई सीएफ ऑब्जेक्ट है जिसे आप -retain का उपयोग कर रहे हैं, तो शायद आपको CFRetain() का उपयोग करना चाहिए।

इस के बाकी अंधेरे में शूटिंग है ....

आप ढेर अप कदम और मानकों कि इन सी ++ तरीकों (या विशेष रूप से auto_zone_release) के लिए पारित किया जा रहा है को देखकर कुछ जानकारी हासिल कर सकते हैं। क्या पहले पैरामीटर में है देखने के लिए प्रयास करने के लिए gdb में इस प्रयास करें:

p *($esp) 

और अगर आप वस्तु पारित किया जा रहा बारे में कोई जानकारी प्राप्त कर सकते हैं।

po (id)(*($esp)) 
+0

रॉब - एक जीसी पर्यावरण में, एनओयूपी कॉल नहीं कर रहे हैं? मुझे लगता है कि यह एक बग है और मैं इसके बारे में एक रडार बग खोलूंगा। धन्यवाद! –

+1

-जीआरसी में एक एनओयूपी है, लेकिन सीएफआरटीएएन() नहीं है। तो यदि आप कॉल करते हैं और फिर CFRelease(), तो आप असंतुलित हो जाएंगे। –

3

यह _NSCFURLProtocolBridge के कार्यान्वयन में एक बग है: शायद यह अगर आप भाग्यशाली हैं काम करेंगे।

कृपया http://bugreport.apple.com/ का उपयोग करें और एक बग फ़ाइल करें। यदि आप इस पृष्ठ पर यूआरएल शामिल करते हैं, तो इसकी सराहना की जाएगी (और यदि आप इस पेज को रडार # के साथ अपडेट करते हैं, तो इसकी भी सराहना की जाएगी)। आदर्श रूप में, यदि आप अपने स्क्रीनसेवर की बाइनरी संलग्न कर सकते हैं, तो यह बहुत उपयोगी होगा; कोई स्रोत की आवश्यकता नहीं है।

सौभाग्य से, यह किसी दुर्घटना का कारण नहीं बनना चाहिए। दुर्भाग्य से, यह शायद एक रिसाव का कारण बनता है।

1

मैं अंतिम रूप देने में ग्राहक आईएनजी, और CFReleasestartLoading

-(void)startLoading 
{ 
     if (client) CFRelease(client); 
     client = [self client]; 
     CFRetain(client); 

के बगल में फोन पर इसे फिर से आईएनजी और हां, CFRetain द्वारा इस समस्या के समाधान में काम किया,

-(void)finalize 
{ 
    if (client) CFRelease(client); 
    [super finalize]; 
} 

clientNSURLProtocol उपclass का एक उदाहरण चर है।

1

यहाँ बग रिपोर्ट मैं एक समय पहले दायर किया था है:

http://openradar.appspot.com/8087384

शायद लायक रूप में अच्छी तरह, यह पहले से ही किया गया है dup एड दाखिल है, लेकिन यह यह करने के तय करने के लिए अच्छा होगा।

के रूप में एलेक्स ने कहा, एक एप्पल डेवलपर मेरे सामने स्रोत कोड को देखा और उदाहरण हम था के साथ आसानी से मुद्दा स्थित है।

+0

यह बग रडार की एक डुप्ली के रूप में बंद कर दिया गया था: // 8070298, जो शेर में तय किया गया प्रतीत होता है। –

0

एक ही त्रुटि कभी-कभी खुले संवाद फ़िल्टर में NSURL का उपयोग करके आती है। मेरे लिए यह स्पष्ट रूप से शून्य करने के लिए पर्याप्त था जब मुझे इसकी आवश्यकता नहीं है।

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