gpt4 book ai didi

objective-c - 将 CFArrayRef 转换为 NSArray 时崩溃

转载 作者:太空狗 更新时间:2023-10-30 03:42:02 24 4
gpt4 key购买 nike

这很好:

CFArrayRef windowList = CGWindowListCopyWindowInfo(kCGWindowListOptionOnScreenOnly, kCGNullWindowID);
NSLog(@"%@", (__bridge NSArray *)windowList);

这会导致 EXC_BAD_ACCESS:

CFArrayRef windowIDList = CGWindowListCreate(kCGWindowListOptionOnScreenOnly, kCGNullWindowID);
NSLog(@"Array %@", (__bridge NSArray*) windowIDList);

最佳答案

数组创建为 NSArray s 只能包含行为类似于 Objective-C 对象的元素。

数组创建为 CFArray s 可以包含任何内容,如果您传递适当的 CFArrayCallBacksCFArrayCreate .

CGWindowListCreate 正在创建一个 CFArray,并用不像对象的东西填充它,但是 CGWindowListCreate 正在使用 不关心那个的 CFArrayCallbacks

当您尝试使用 %@ 格式说明符打印此 CFArray 时,NSLog 发送一个 Objective-C -description 消息到数组。 CFArray 通过向其每个元素发送 Objective-C description 消息来处理此问题。不幸的是,它的元素不是对象,所以不可能向它们发送 Objective-C 消息。因此崩溃。

试试这个:

CFStringRef description = CFCopyDescription(windowIDList);
NSLog(@"Array %@", description);
CFRelease(description);

CFCopyDescription 函数对数组的每个元素使用 CFArrayCallbacks 函数之一,而不是尝试向每个元素发送 Objective-C 消息。回调知道如何处理数组元素,所以它工作正常。我在我的测试程序中得到这个输出:

2011-11-10 18:50:23.888 test[15156:707] <CFArray 0x1001140c0 [0x7fff7fd24ea0]>{type = mutable-small, count = 19, values = (
0 : <0x7d7>
1 : <0x2d>
2 : <0x20>
3 : <0x21>
4 : <0x1e>
5 : <0x9>
6 : <0x7a8>
7 : <0x2c>
8 : <0x2e>
9 : <0x743>
10 : <0x32>
11 : <0x85>
12 : <0x695>
13 : <0x62a>
14 : <0x62b>
15 : <0xa>
16 : <0x26>
17 : <0x18>
18 : <0x2>
)}

关于objective-c - 将 CFArrayRef 转换为 NSArray 时崩溃,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8087616/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com