Есть ли возможность использовать FSEventStreamCreate без NSString

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

Решение

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);
1

Другие решения

Других решений пока нет …