当我使用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
答案 0 :(得分:1)
CGWindowID
类型定义为uint32_t
。这是一个32位值。 CFArrayCreate()
假定values
参数为(引自the docs,重点为我):
要在新数组中包含 pointer-size 值的C数组。
由于您大概是针对64位进行编译的,因此指针的大小为64位,而不是32位。因此,数组元素的位置不正确。
最简单的解决方法是将windowIds
数组声明为uintptr_t
而不是CGWindowID
的数组。