我的项目是而不是arc或cocoa ,所以我不想在我的代码中使用NSString
,但它似乎不起作用。
Xcode显示"ERROR: (CFStringGetTypeID() != CFGetTypeID(cfStringRef)) (i = 0)"
。
我该如何创建CFString?
代码如下:
const char *path = m_directory.AsCharPtr();
CFStringRef directory = CFStringCreateWithCString(kCFAllocatorDefault,path,kCFStringEncodingUTF8);
CFArrayRef pathsToWatch = CFArrayCreate(kCFAllocatorMalloc, (const void **)directory, 1, NULL);
void *appPointer = this;
FSEventStreamContext context = {0, appPointer, NULL, NULL, NULL};
FSEventStreamRef stream;
CFAbsoluteTime latency = 1.0; /* Latency in seconds */
/* Create the stream, passing in a callback */
stream = FSEventStreamCreate(NULL, &fsevents_callback,
&context,
pathsToWatch,
kFSEventStreamEventIdSinceNow, /* Or a previous event ID */
latency,
kFSEventStreamCreateFlagFileEvents /* Flags explained in reference */
);
答案 0 :(得分:1)
CFArrayCreate()
期望一个数组,其元素是任意指针,因此void **
。但是,在:
CFArrayCreate(kCFAllocatorMalloc, (const void **)directory, 1, NULL);
您传递的是单个元素而不是数组。请注意,由于函数需要一个数组,它会取消引用第二个参数中的地址,将其偏移以迭代数组。请记住,array[i]
相当于*(array + i)
;特别是,array[0]
相当于*array
。
一般的解决方案是创建一个数组并将其传递给函数,如下所示:
const void *directories[] = {directory};
CFArrayCreate(kCFAllocatorMalloc, directories, 1, NULL);
但由于数组只有一个元素,你也可以写:
CFArrayCreate(kCFAllocatorMalloc, (const void **)&directory, 1, NULL);