मैं कुछ समय से एक परियोजना पर काम कर रहा हूं, और मैंने एआरसी को कूदने का फैसला किया। मैं कुछ कोड में आया जो हर बार बमबारी कर रहा था, और मैं जानना चाहता हूं कि क्यों। मैं इस स्निपेट के लिए नीचे को आसान बनाने में कामयाब रहे:एआरसी और मॉलोक: EXEC_BAD_ACCESS
typedef __strong id MYID;
int main(int argc, char *argv[])
{
MYID *arr = (MYID *) malloc(sizeof(MYID) * 4);
arr[0] = @"A"; // always get an EXEC_BAD ACCESS HERE
arr[1] = @"Test";
arr[2] = @"Array";
arr[3] = @"For";
// uh oh, we need more memory
MYID *tmpArray = (MYID *) realloc(arr, sizeof(MYID) * 8);
assert(tmpArray != NULL);
arr = tmpArray;
arr[4] = @"StackOverflow"; // in my actual project, the EXEC_BAD_ACCESS occurs here
arr[5] = @"Is";
arr[6] = @"This";
arr[7] = @"Working?";
for (int i = 0; i < 8; i++) {
NSLog(@"%@", arr[i]);
}
return 0;
}
मैं काफी यकीन है कि यहाँ क्या हो रहा है 4 विभिन्न परियोजनाओं में इस थक, नहीं कर रहा हूँ, और वे सभी असफल। क्या मेरे malloc
कॉल में कुछ गड़बड़ है? कभी-कभी यह शून्य हो जाता है, और दूसरी बार यह एक सूचक देता है जिसे मैं एक्सेस नहीं कर सकता।
टाइपपीफ क्यों? ऑब्जेक्ट पॉइंटर्स जो अन्यथा योग्य नहीं हैं उन्हें '__strong' माना जाता है। –
क्योंकि वास्तविक प्रोजेक्ट में, 'MYID' एक स्ट्रक्चर का हिस्सा है (कोकोस 2 डी का सीसीसीएरे)। साथ ही, कोड स्वामित्व के लिए क्वालीफायर के बिना संकलित नहीं होगा, क्योंकि यह एक चयनकर्ता का हिस्सा नहीं है जहां मालिक 'स्वयं' हो सकता है। –
मुझे यकीन नहीं है कि आपका क्या मतलब है "क्योंकि यह एक चयनकर्ता का हिस्सा नहीं है जहां मालिक 'स्वयं' हो सकता है। किसी विधि में आवंटित ऑब्जेक्ट का "स्वामी" स्टैक स्वयं होता है, न कि 'self' का मान। यह भी ध्यान रखें कि आप एआरसी के तहत सी संरचना में '__strong' (या' __weak') ऑब्जेक्ट पॉइंटर्स नहीं रख सकते हैं, आपको '__unsafe_unretained' का उपयोग करना होगा और स्मृति को स्पष्ट रूप से प्रबंधित करना होगा (उदाहरण के लिए कुछ गैर-एआरसी कोड या 'CFRetain()'/'CFRelease()')। –