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

objective-c – 将CFArrayRef转换为NSArray时崩溃,第1张

概述这可以: CFArrayRef windowList = CGWindowListCopyWindowInfo(kCGWindowListOptionOnScreenOnly, kCGNullWindowID);NSLog(@"%@", (__bridge NSArray *)windowList); 这会导致EXC_BAD_ACCESS: CFArrayRef windowIDList = C 这可以:

CFArrayRef windowList = CGWindowListcopyWindowInfo(kCGWindowListOptionOnScreenOnly,kCGNullWindowID);NSLog(@"%@",(__brIDge NSArray *)windowList);

这会导致EXC_BAD_ACCESS:

CFArrayRef windowIDList = CGWindowListCreate(kCGWindowListOptionOnScreenOnly,kCGNullWindowID);NSLog(@"Array %@",(__brIDge NSArray*) windowIDList);
解决方法 创建为 NSArrays的数组只能包含像Objective-C对象一样的元素.

如果将适当的CFArrayCallBacks传递给CFArrayCreate,则创建为CFArray的数组可以包含任何内容.

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

当您尝试使用%@格式说明符打印此CFArray时,NSLog会向该阵列发送一个Objective-C -description消息. CFArray通过向每个元素发送Objective-C描述消息来处理此问题.不幸的是,它的元素不是对象,所以不可能向它们发送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时崩溃全部内容,希望文章能够帮你解决objective-c – 将CFArrayRef转换为NSArray时崩溃所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址:https://54852.com/web/1017360.html

(0)
打赏 微信扫一扫微信扫一扫 支付宝扫一扫支付宝扫一扫
上一篇 2022-05-23
下一篇2022-05-23

发表评论

登录后才能评论

评论列表(0条)

    保存