![](/img/trans.png)
[英]Implicit conversion of a non-Objective-C pointer type 'int *' to 'Bird *' is disallowed with ARC
[英]Implicit conversion of a non-Objective-C pointer type void* to NSString*__strong* is disallowed with ARC
迁移到ARC时出现上述错误。 这是代码:
static NSString *cashBalanceKeyPath = @"test";
...
[xxx forKeyPath:cashBalanceKeyPath options:NSKeyValueObservingOptionNew context:&cashBalanceKeyPath];
...
-(void)observeValueForKeyPath:(NSString *)keyPath
ofObject:(id)object
change:(NSDictionary *)change
context:(void *)context {
if (&cashBalanceKeyPath == context) < error here
{
...
}
当我使用电桥时:
if (&cashBalanceKeyPath == (__bridge NSString *)context)
我收到错误: Comparison of distinct pointer types (NSString *__strong* and NSString *)
我如何进行转换? 提前致谢。
我无法确切告诉您原因,但是如果您交换比较顺序,则不会收到警告或错误消息:
if (context == &cashBalanceKeyPath) {
// ...
}
您似乎将变量的地址用作唯一标记,因此这里没有内存管理/所有权问题。 要进行地址比较,请将变量的地址转换为void:
if ((void *)&cashBalanceKeyPath == context)
这似乎为编译器提供了所需的一切,而无需任何转换。
如果删除错误消息中的__strong
, __strong
清楚了发生了什么:
Comparison of distinct pointer types (NSString ** and NSString *)
&cashBalanceKeyPath
是指向NSString对象或NSString**
的指针,而上下文则被&cashBalanceKeyPath
为NSString*
或普通NSString对象(不是)。
因此,要解决此问题,请将演员表更改为(NSString * const *)
,显然,必须使用const才能安抚ARC。
由于cashBalanceKeyPath
是一个指针, context
是一个指针,比较这两者的正确方法是:
- (void)observeValueForKeyPath:(NSString *)keyPath ofObject:(id)object change:(NSDictionary *)change context:(void *)context {
if (context == (__bridge void *)(cashBalanceKeyPath)) {
}
}
呼叫应该是:
[xxx addObserver:self forKeyPath:cashBalanceKeyPath options:0 context:(__bridge void *)(cashBalanceKeyPath)];
我不知道您的代码如何与MRC一起使用。
整个问题可能可以通过写来避免
static int cashBalanceKeyPathContext = 0;
并使用&cashBalanceKeyPathContext作为上下文。
出现错误的原因是,当您确实只想比较两个字符串时,您正在比较字符串和指向字符串的指针。 比较两个字符串时,应使用isEqualToString
。 因此您的代码可能如下所示:
NSString *contextString = (__bridge NSString *)context;
if ([contextString isEqualToString:cashBalanceKeyPath])
{
//Do something
}
...
希望这可以帮助!
如果要比较字符串,则应使用isEqualToString方法:
对于字符串,ARC通常不喜欢__strong,并且Apple建议您使用copy。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.