是否可以在没有NSString的情况下使用FSEventStreamCreate

时间:2013-06-08 09:29:28

标签: c++ core-foundation

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

1 个答案:

答案 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);