0

私のプロジェクトはarc または cocoaNSStringではないため、コードで使用したくありませんが、機能していないようです。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);

配列ではなく単一の要素を渡しています。この関数は配列を想定しているため、2 番目の引数のアドレスを逆参照し、オフセットして配列を反復処理することに注意してください。は;array[i]と同等であることを思い出してください。*(array + i)特に、array[0]と同等*arrayです。

一般的な解決策は、配列を作成し、次のように関数に渡すことです。

const void *directories[] = {directory};
CFArrayCreate(kCFAllocatorMalloc, directories, 1, NULL);

しかし、配列には要素が 1 つしかないため、次のように書くこともできます。

CFArrayCreate(kCFAllocatorMalloc, (const void **)&directory, 1, NULL);
于 2013-06-08T10:12:28.810 に答える