我一直在做一段時間的項目,現在我決定跳到ARC。 我遇到了一些每次都在轟炸的代碼,我想知道爲什麼。我設法簡化下來到這個片段: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;
}
我不太清楚這裏發生了什麼,厭倦了這4個不同的項目,他們都失敗。我的malloc
電話有問題嗎?有時它返回null,有時它返回一個我無法訪問的指針。
爲什麼typedef?沒有其他限定的對象指針被假定爲'__strong'。 – 2012-02-02 20:36:33
因爲在實際的項目中,'MYID'是一個struct(cocos2d的ccCArray)的一部分。此外,如果沒有所有權限定符,代碼將不會編譯,因爲它不是所有者可能是「自我」的選擇器的一部分。 – 2012-02-02 20:37:35
我不確定你的意思是「因爲它不是選擇者的一部分,所有者可能是'自我'」。在方法中分配的對象的「所有者」是堆棧本身,而不是「self」的值。還要注意,你不能將'__strong'(或'__weak')對象指針放在ARC下的C結構中,你必須使用'__unsafe_unretained'並明確地管理內存(例如用一些非ARC代碼或'CFRetain()' /'CFRelease()')。 – 2012-02-02 20:40:37