2011-08-05 11 views
27

मैं एआरसी के लिए मेरे सॉकेट ग्राहक परिवर्तित कर रहा हूँ "लिखने-वापस लिए __autoreleasing पैरामीटर के लिए गैर स्थानीय वस्तु का पता पासिंग":त्रुटि

- (id)initWithHostname:(NSString *)hostname AndPort:(NSInteger)port 
{ 
    if((self = [super init])) 
    { 
     oBuffer = [[NSMutableData alloc] init]; 
     iBuffer = [[NSMutableData alloc] init]; 

     iStream = [[NSInputStream alloc] init]; 
     oStream = [[NSOutputStream alloc] init]; 

     [NSStream getStreamsToHost:[NSHost hostWithName:hostname] port:port inputStream:&iStream outputStream:&oStream]; 

     ... 
    } 

    return self; 
} 

त्रुटि मुझे मिल गया है:

file://localhost/...foo.m: error: Automatic Reference Counting Issue: Passing address of non-local object to __autoreleasing parameter for write-back

पर "& iStream"/"& oStream"

[NSStream getStreamsToHost:[NSHost hostWithName:hostname] port:port inputStream:&iStream outputStream:&oStream]; 

किसी भी मदद की इस लाइन पर?

+0

को देखते हुए कैसे नए एआरसी है, तो आप डेवलपर मंचों पर इस पूछने के लिए बेहतर कर सकता है के रूप में घोषित किया जाना चाहिए । – jtbandes

+0

निश्चित रूप से, निश्चित रूप से;) – kilianc

उत्तर

37

यह त्रुटि आमतौर पर गैर स्थानीय चर के पते को किसी विधि के लिए पारित की जाती है। क्योंकि चर को __strong डिफ़ॉल्ट के रूप में घोषित किया जाता है, जबकि विधि का पैरामीटर __autoreleasing है, इसलिए __strong के रूप में लागू विधि के पैरामीटर की घोषणा करें, इस तरह: -(void)method:(id * __strong *)para.
ध्यान दें कि सिर फ़ाइल (ज फ़ाइल) में विधि .m फ़ाइल का एक ही

+0

इस सुझाव ने पूरी तरह से इस मुद्दे को हल किया। मेरे मामले में गैर एआरसी कोड, उत्तरार्द्ध ivar मान और स्थानीय अस्थायी चर के लिए ivar असाइन करने के अन्य कामकाज को जारी करता है, इसे लक्ष्य फ़ंक्शन पर पास करता है और इसे @Rudy Velthuis द्वारा सुझाए गए अनुसार ivar पर फिर से सौंपता है हालांकि संकलक त्रुटि परिचय हल करता है रिलीज मेमोरी के रूप में रनटाइम में EXC_BAD_ACCESS त्रुटि अभी भी लटक रही है और इसे रिलीज़ होने के बाद गैर एआरसी कोड के अंदर संदर्भित किया जा रहा है। – Rajaraman

12

मुझे लगता है कि आपको iStream और oStream चरों को आवंटित नहीं करना चाहिए और इनिट नहीं करना चाहिए। वे प्राप्त करने के लिए हैं। एआरसी के बिना यह केवल दो मेमोरी लीक बनाता है जो अनजान हो जाते हैं। अब आपका कंपाइलर एआरसी का उपयोग करता है और फिर इससे कोई फर्क नहीं पड़ता। प्राप्त चर स्थानीय होना चाहिए:

तो कोशिश:

NSInputStream *iStream; 
    NSOutputStream *oStream; 

    oBuffer = [[NSMutableData alloc] init]; 
    iBuffer = [[NSMutableData alloc] init]; 

    [NSStream getStreamsToHost:[NSHost hostWithName:hostname] port:port inputStream:&iStream outputStream:&oStream]; 

काम करना चाहिए यही कारण है, AFAICT। लेकिन ध्यान दें: मैं इसे यहां परीक्षण नहीं कर सकता।

+0

धन्यवाद रुडी, आपका कोड काम करता है। लेकिन मुझे कुछ स्पष्टीकरण चाहिए। आप 'iStream' और' oStream' के लिए मेरे इंस्टेंस पॉइंटर्स के बजाय दो स्थानीय पॉइंटर्स का उपयोग कर रहे हैं, इसलिए मेरे पास मेरी स्ट्रीम का इन्सटेंस संदर्भ नहीं हो सकता है? ऐसा इसलिए है क्योंकि एनएसएसटी स्ट्रीम स्ट्रीम को किसी भी समय बदल सकता है या क्या? – kilianc

+0

@kilianc: मुझे नहीं पता। त्रुटि संदेश ने गैर-स्थानीय चर के बारे में शिकायत की, इसलिए मुझे लगता है कि वे स्थानीय होना चाहिए। मेरे पास इसका परीक्षण करने के लिए एआरसी कंपाइलर नहीं है। फिर आप उन्हें गुण या ivars को असाइन कर सकते हैं। –

+0

यहां एक बेहतर उत्तर दिया गया है: http://stackoverflow.com/questions/7415301/automatic-reference-counting-issue-passing-address-of-non-local-object-to-aut – nduplessis

13

दो स्थानीय चर बनाएं, विधि के पते को उनके पास पास करें, फिर लौटने के बाद अपने मूल्यों को ivars को असाइन करें।