अद्यतन: यह आईओएस 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];
तो मेरा अनुमान है कि यह जब होता है
अद्यतन, कुछ और प्रयोगों किया एआरसी और गुमनाम सी सरणी संयोजन।
एक एसएससीसीई –
पोस्ट करने के लिए +1 जब आप सरणी शाब्दिक का उपयोग करते हैं, तो संकलक निम्नलिखित '' आईडी ऑब्जेक्ट [] = {obj} उत्पन्न करता है; NSUInteger count = sizeof (ऑब्जेक्ट्स)/sizeof (id); [NSArray arrayWithObjects: ऑब्जेक्ट गिनती: गिनती]; '' मुझे आश्चर्य है कि प्ले सी एरे –
के माध्यम से जाने के कारण कोई बग है या नहीं। मैं इसे एक बग कहूंगा। मैंने '@ [obj]' और '[NSArray arrayWithObject: obj] 'x86_64 के लिए variant को एलएलवीएम 4.1 के तहत -ऑएस ऑप्टिमाइज़ेशन के रूप में देखा है; और संकलक 'एनएसएआरआरई' से पहले 'obj' पर' obj_release' कॉल को सम्मिलित करता है। जब तक मैं किसी से ज्यादा चालाक नहीं करता, मैं इसे एक बग कहूंगा। – FluffulousChimp