I have been working on a project for some time now, and I decided to make the jump to ARC. I came across some code that was bombing out every time, and I would like to know why. I have managed to simplify it down to this snippet:
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;
}
I'm not quite sure what is happening here, tired this in 4 different projects, and they all fail. Is there something wrong with my malloc
call? Sometimes it returns null, and other times it returns a pointer that I can't access.
__strong
. – DecrepitudeMYID
is a part of a struct (cocos2d's ccCArray). Also, the code will not compile without a qualifier for ownership, because it isn't part of a selector where the owner could be 'self'. – Mckenneyself
. Also note that you cannot place__strong
(or__weak
) object pointers into a C struct under ARC, you must use__unsafe_unretained
and manage the memory explicitly (e.g. with some non-ARC code or withCFRetain()
/CFRelease()
). – Decrepitude