2013-02-08 3 views
0
unsigned char _MyString[] = {0xda, 0xe5, 0x18, ..., 0x00}; 

CFArrayRef array = CFArrayCreate(NULL, 
           (const void**) CFStringCreateWithBytes(NULL, 
                     _MyString, 
                     sizeof(_MyString), 
                     kCFStringEncodingASCII, 
                     FALSE), 
           1, 
           &kCFTypeArrayCallBacks); 

CFShow(arr); // <-- EXEC_BAD_ACCESS ERROR 

디버거는 그것의 실패 표시 CFCreateArray로 작성된CFArray 액세스 할 때 충돌

CoreFoundation`CFGetTypeID :

__NSCFString

디버거에서

출력 (lldb)

메모리 오류가 어디 있는지 확실하지 않지만 CFArrayCreate()에 문자열이 전달되어야합니다.

답변

1

const void **에 CFStringCreateWithBytes의 반환 값을 캐스팅하는 것이 올바르지 않으므로 충돌이 발생합니다. 이것은 포인터에 대한 포인터가 아니며 CFString에 대한 포인터입니다.

+0

그리고 해결책은 CFString을 다른 변수에 저장 한 다음 그 변수에 포인터를 전달하는 것입니다. 왜냐하면 CFArrayCreate가'numValues' 객체를 포함하는 저장소에 대한 포인터를 원하기 때문에 하나의 객체 배열을 만들 때 일반 변수는 하나의 객체를 포함하는 저장소로 계산됩니다. –