беспорядок элементов при создании CFArrayRef с использованием CFArrayCreate - PullRequest
0 голосов
/ 16 мая 2019

Когда я создаю CFArrayRef, используя CFArrayCreate, чтобы содержать некоторый CGWindowID;Я обнаружил, что созданный CFArrayRef имеет неупорядоченные элементы, что не ожидается.

вход представляет собой NSArray из NSNumbers, который содержит элементы с типом CGWindowID, я хочу преобразовать этот NSArray в CFArrayRef для дальнейшей обработки.

- (void)getArrayRefForWindowList:(NSArray<NSNumber *>)windowIdList
    {
        int windowCount = (int)windowIdList.count;
        NSLog(@"  to show input Count >>>>>>>> %d",windowCount);
        CGWindowID windowIds[windowCount];
        for(int i=0;i<windowCount;i++)
        {
            windowIds[i] = (CGWindowID)[windowIdList[i] intValue];
            NSLog(@"  to show orignial %d",windowIds[i]);
        }
        void *windowIdsParam = windowIds;
        CFArrayRef windowArrayRef = CFArrayCreate(kCFAllocatorDefault, (const void **)windowIdsParam, (CFIndex)windowCount, nil);
        for(int i=0;i<windowCount;i++)
        {
            CGWindowID windId = (CGWindowID)CFArrayGetValueAtIndex(windowArrayRef, i);
            NSLog(@"  to show destination %d",windId);
        }
        NSLog(@"  to show outPut Count<<<<<<<<<%ld",(long)CFArrayGetCount(windowArrayRef));
}

Я ожидаю, что windIds будут помещены в windowArrayRef полностью и упорядоченно.Но на самом деле, некоторые из windId отсутствуют, ниже информация о NSLog.Вы можете увидеть, что 6405,6395,3919,199 отсутствует, а последние 4 элемента являются мусором.Может ли кто-нибудь помочь указать, в чем здесь ошибка?

to show input Count >>>>>>>> 8

to show orignial 6410

to show orignial 6405

to show orignial 6400

to show orignial 6395

to show orignial 5432

to show orignial 3919

to show orignial 200

to show orignial 199

to show destination 6410

to show destination 6400

to show destination 5432

to show destination 200

to show destination -272646672

to show destination 1349209287

to show destination -272646640

to show destination 1882819913

to show outPut Count<<<<<<<<< 8

1 Ответ

1 голос
/ 16 мая 2019

CGWindowID - это typedef'd to uint32_t.Это 32-битное значение.CFArrayCreate() предполагает, что параметр values (в кавычках из документы , выделение):

массив AC значений размером с указатель чтобы быть в новом массиве.

Так как вы, вероятно, компилируете для 64-битного, указатель имеет размер 64 бита, а не 32 бита.Таким образом, ваши элементы массива расположены неправильно.

Самое простое решение - объявить массив windowIds как массив uintptr_t, а не CGWindowID.

...