0

我的项目不是 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 */
                             );
4

1 回答 1

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);
于 2013-06-08T10:12:28.810 回答