使用CFArrayCreate创建CFArrayRef时元素的混乱

时间:2019-05-16 12:48:24

标签: arrays objective-c core-foundation

当我使用CFArrayCreate创建一个CFArrayRef来包含一些CGWindowID时;我发现创建的CFArrayRef具有混乱的元素,这是不期望的。

输入是一个包含NSNumbers的NSArray,其中包含类型为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 个答案:

答案 0 :(得分:1)

CGWindowID类型定义为uint32_t。这是一个32位值。 CFArrayCreate()假定values参数为(引自the docs,重点为我):

  

要在新数组中包含 pointer-size 值的C数组。

由于您大概是针对64位进行编译的,因此指针的大小为64位,而不是32位。因此,数组元素的位置不正确。

最简单的解决方法是将windowIds数组声明为uintptr_t而不是CGWindowID的数组。