2012-12-03 24 views
13

अद्यतन: यह आईओएस 6.1 डीपी 3 एसडीके में तय किया गया था जब भी दायरे के अंदर बनाया गया ऑब्जेक्ट बनाया गया था।स्कोप

मैंने डिफॉल्ट रिलीज बिल्ड कॉन्फ़िगरेशन (डीबग ठीक काम करने के लिए प्रतीत होता है) का उपयोग करते हुए एआरसी के साथ निर्माण करते समय उपयोग-बाद-विघटित क्रैश को ट्रैक किया है। समस्या तब होती है जब किसी ऑब्जेक्ट को गैर-निरंतर स्थिति वाले किसी ऑब्जेक्ट को बनाते हुए, इसे स्कोप के बाहर से एक चर को असाइन किया जाता है और फिर केवल उद्देश्य-सी सरणी या शब्दकोश अक्षर का उपयोग करके चर का संदर्भ देता है।

void test(BOOL arg) 
{ 
    id obj = nil; 

    if (arg) { 
     obj = [NSObject new]; 
    } 

    // obj already deallocated here 
    @[obj]; 

    // but using NSArray works 
    //[NSArray arrayWithObject:obj]; 

    // @[obj] works if obj is referenced i.e. by NSLog print out 
    //NSLog(@"%@", obj); 
} 

int main(int argc, const char * argv[]) 
{ 
    @autoreleasepool { 
     test(YES); 
    } 
    return 0; 
} 

जब मैं निर्माण और ज़ोंबी वस्तुओं के साथ इस चलाने सक्षम मैं इस त्रुटि संदेश मिलता है: जैसा कि मैंने टिप्पणी की

-[NSObject retain]: message sent to deallocated instance 0x100109100 

यहाँ सबसे छोटी प्रतिलिपि प्रस्तुत करने योग्य मामला मैं खोजने के लिए प्रबंधित किया है है कोड में यह ठीक काम करता है अगर obj किसी अन्य तरीके से संदर्भित है, जैसे NSLog या इसके बजाय NSArray का उपयोग करना। क्या मैंने गलत समझा है कि एआरसी और स्कॉप्स के साथ ऑब्जेक्ट्स कैसे जारी किए जाते हैं या क्या यह एलएलवीएम या क्लैंग में ऑप्टिमाइज़ेशन बग है?

मैं क्लैंग संस्करण 4.1 (टैग/ऐप्पल/क्लैंग -421.11.66) (एलएलवीएम 3.1 एसवीएन पर आधारित) के साथ एक्सकोड 4.5.2 का उपयोग कर रहा हूं। आईओएस सिम्युलेटर और मैक ओएस एक्स के लिए x86 64 बिट के लिए निर्माण करते समय मैं इसे पुन: पेश कर सकता हूं और मुझे पूरा यकीन है कि एआरएम के निर्माण के दौरान एक ही समस्या तब होती है जब आईफोन पर रिलीज चलाने के दौरान पहली बार समस्या मिली थी।

मैंने ऐप्पल को दायर और बग रिपोर्ट दी है और open radar report बनाया है।

क्या, अगर कुछ भी है, तो मुझे याद आ रही है?

के रूप में Gabro संकलक ने बताया एक [NSArray arrayWithObjects:count:] बयान के @[] अनुवादित करता है मैंने किया था कुछ परीक्षण:

// works 
id a[] = {obj}; 
[NSArray arrayWithObjects:a count:1]; 

// does not work 
const id *b = (id[]){obj}; 
[NSArray arrayWithObjects:b count:1]; 

// does not work 
[NSArray arrayWithObjects:(id[]){obj} count:1]; 

तो मेरा अनुमान है कि यह जब होता है

अद्यतन, कुछ और प्रयोगों किया एआरसी और गुमनाम सी सरणी संयोजन।

+0

एक एसएससीसीई –

+1

पोस्ट करने के लिए +1 जब आप सरणी शाब्दिक का उपयोग करते हैं, तो संकलक निम्नलिखित '' आईडी ऑब्जेक्ट [] = {obj} उत्पन्न करता है; NSUInteger count = sizeof (ऑब्जेक्ट्स)/sizeof (id); [NSArray arrayWithObjects: ऑब्जेक्ट गिनती: गिनती]; '' मुझे आश्चर्य है कि प्ले सी एरे –

+1

के माध्यम से जाने के कारण कोई बग है या नहीं। मैं इसे एक बग कहूंगा। मैंने '@ [obj]' और '[NSArray arrayWithObject: obj] 'x86_64 के लिए variant को एलएलवीएम 4.1 के तहत -ऑएस ऑप्टिमाइज़ेशन के रूप में देखा है; और संकलक 'एनएसएआरआरई' से पहले 'obj' पर' obj_release' कॉल को सम्मिलित करता है। जब तक मैं किसी से ज्यादा चालाक नहीं करता, मैं इसे एक बग कहूंगा। – FluffulousChimp

उत्तर

1

मैं बस निम्नलिखित कोड दोनों OSX के लिए (86 से 64) और iOS सिम्युलेटर इमारत परीक्षण किया है और मैं बग

void test(BOOL arg) { 
    id obj = nil; 

    if (arg) { 
     obj = [NSObject new]; 
    } 
    @[obj]; 
    NSLog(@"Hi there"); 
} 

int main(int argc, const char * argv[]) { 
    @autoreleasepool { 
     test(YES); 
    } 
    return 0; 
} 

ऊपर कोड बस प्रिंट कंसोल और रिटर्न में Hi there पुन: पेश नहीं कर सकते।

मेरा कॉन्फ़िगरेशन आपके जैसा ही है: एक्सकोड 4.5.2 और ऐप्पल क्लैंग संस्करण 4.1 (टैग/ऐप्पल/क्लैंग -421.11.66) (एलएलवीएम 3.1 एसवीएन पर आधारित) एक कंपाइलर के रूप में।

संपादित

मैं भी

clang -fobjc-arc -framework Foundation main.m 

का उपयोग कर (ऊपर के उदाहरण की शुरुआत में #include <Foundation/Foundation.h> जोड़ने के बाद) कमांड लाइन से संकलन करने की कोशिश की और परिणाम फिर से

2012-12-03 12:47:45.647 a.out[39421:707] Hi there 
था

संपादित करें 2 जैसा टिप्पणियों में बताया गया है कि -O0 पर अनुकूलन स्तर को बढ़ाने में बग को पुन: पेश करना संभव है। सारांश:

clang -O0 -fobjc-arc -framework Foundation main.m 

कार्यक्रम काम करता है के रूप में उम्मीद

clang -O1 -fobjc-arc -framework Foundation main.m 

प्रश्न में प्रस्तुत बग दिखाई देता है। यह -O0

पर किसी भी अनुकूलन स्तर के साथ सच है यह निश्चित रूप से संकलक में एक बग है।

+0

यह अजीब है। और आप सुनिश्चित हैं कि एआरसी के साथ संकलन? –

+1

क्या अनुकूलन स्तर? मैं ** ** ओओ के मुद्दे को '-O0' के ऊपर किसी भी अनुकूलन स्तर के साथ पुन: पेश कर सकता हूं। ऑप्टिमाइज़ेशन के साथ, कंपाइलर 'obj' को ओवर-रिलीज़ नहीं करता है - अन्यथा यह करता है। – FluffulousChimp

+0

आह क्षमा करें अब मैं '-फोब-आर्क 'देखता हूं। Yepp आपका उदाहरण मेरे लिए भी काम करता है लेकिन यदि मैं डिफ़ॉल्ट आईओएस रिलीज बिल्ड कॉन्फ़िगरेशन के रूप में '-Os' जोड़ता हूं तो यह रिलीज़ होने लगता है। –

1

आप कुछ भी याद नहीं कर रहे हैं। यह एक कंपाइलर बग है।

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