【问题标题】:Type conversion causing compilation error in ARC environmentARC环境下类型转换导致编译错误
【发布时间】:2013-04-19 14:50:58
【问题描述】:

我在 ARC 环境中的类型转换遇到问题。如果有人也愿意解决它:

当我使用这行代码时:

NSData *resultData = nil;

NSMutableDictionary *passwordQuery = [query mutableCopy];

[passwordQuery setObject: (id) kCFBooleanTrue forKey: (__bridge  id) kSecReturnData];

status = SecItemCopyMatching((__bridge  CFDictionaryRef) passwordQuery, (CFTypeRef *) &resultData);

然后我收到一个错误:

Cast of an indirect pointer to an Objective C pointer to 'CFTypeRef*'(aka 'const void **')is disallowed with ARC.

请给我建议任何解决这个问题的方法..

提前谢谢..

【问题讨论】:

标签: ios automatic-ref-counting type-conversion


【解决方案1】:

在调用SecItemCopyMatching 之前,结果数据类型只是CFTypeRef,所以首先传入CFTypeRef

CFTypeRef resultData = nil;
status = SecItemCopyMatching((__bridge CFDictionaryRef) passwordQuery,  &resultData);

由于查询指定resultData 应该是CFDataRef,所以resultData 现在是CFDataRef,您现在可以这样转换它。然后将其进一步转换为NSData

CFDataRef resultCFData = (CFDataRef)resultData;
NSData *resultNSData = (__bridge NSData *)resultCFData;

或者在一行中:

NSData *resultNSData = (__bridge NSData *)(CFDataRef)resultData;

【讨论】:

  • 然后可以跳过对CFDataRef的转换;它在那里什么也没做
  • user102008:就编译器而言,强制转换什么也不做,并且在编译过程中消失了。我留下它只是为了提醒任何未来的程序员正在发生的事情。
猜你喜欢
  • 1970-01-01
  • 2014-07-01
  • 1970-01-01
  • 1970-01-01
  • 2013-05-14
  • 1970-01-01
  • 2018-05-16
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多