나는 얼마 동안 프로젝트에서 작업 해 왔고 ARC로 점프하기로 결정했다. 매번 폭탄을 터뜨리는 코드를 발견했습니다. 이유를 알고 싶습니다. 나는 4 개 개의 다른 프로젝트에서이 피곤, 여기에 무슨 일이 일어나고 있는지 아주 확실하지 않다ARC & Malloc : 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;
}
, 그들은 모두 실패 :이 조각에 그것을 아래로 단순화하는 관리했다. 내 malloc
전화에 문제가 있습니까? 때로는 null을 반환하고 다른 경우에는 액세스 할 수없는 포인터를 반환합니다.
왜 typedef입니까? 그렇지 않은 객체 포인터는'__strong'으로 간주됩니다. –
실제 프로젝트에서 'MYID'는 struct (cocos2d의 ccCArray)의 일부이기 때문에. 또한 소유자가 'self'일 수있는 선택자의 일부가 아니기 때문에 코드는 소유권에 대한 한정자없이 컴파일되지 않습니다. –
소유자가 '자기'가 될 수있는 선택자의 일부가 아니기 때문에 "당신이 의미하는 바가 확실하지 않습니다." " 메소드에 할당 된 객체의 "소유자"는 스택 자체이며'self'의 값이 아닙니다. 또한 ARC 아래의 C 구조체에'__strong' (또는'__weak') 객체 포인터를 넣을 수 없으므로'__unsafe_unretained'를 사용하고 명시 적으로 메모리를 관리해야합니다 (예 : 일부 ARC가 아닌 코드 또는'CFRetain() /'CFRelease()'). –