Мой проект не дуга или какао, так что я не хочу использовать 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 */
);
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);
Других решений пока нет …