繁体   English   中英

ARC不允许将非Object-C指针类型void *隐式转换为NSString * __ strong *

[英]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**的指针,而上下文则被&cashBalanceKeyPathNSString*或普通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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM