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

时间:2013-07-02 19:19:41

标签: ios objective-c cocoa automatic-ref-counting

迁移到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
    {
      ...
    }

当我使用bridge时:

if (&cashBalanceKeyPath == (__bridge NSString *)context)

我收到错误:Comparison of distinct pointer types (NSString *__strong* and NSString *)

如何进行转换?提前致谢。

8 个答案:

答案 0 :(得分:2)

我无法确切地告诉您原因,但如果您交换比较顺序,则不会收到警告或错误:

if (context == &cashBalanceKeyPath) {
    // ...      
}

答案 1 :(得分:2)

您似乎使用变量的地址作为唯一标记,因此此处没有内存管理/所有权问题。要进行地址比较,请将变量的地址强制转换为void:

if ((void *)&cashBalanceKeyPath == context)

这似乎给了编译器所需的一切,而没有任何桥接。

答案 2 :(得分:1)

如果您在错误消息中删除__strong,则更清楚发生了什么:

Comparison of distinct pointer types (NSString ** and NSString *)

&cashBalanceKeyPath是指向NSString对象或NSString**的指针,而上下文正在强制转换为NSString*或纯NSString对象(不是)。

因此,为了解决问题,将强制转换更改为(NSString * const *),显然需要const来安抚ARC。

答案 3 :(得分:0)

因为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一起使用。

答案 4 :(得分:0)

可以避免整个问题
static int cashBalanceKeyPathContext = 0;

并使用&amp; cashBalanceKeyPathContext作为上下文。

答案 5 :(得分:-1)

您收到错误的原因是因为您正在比较字符串和指向字符串的指针,当您真的只想比较两个字符串时。当您比较两个字符串时,应使用isEqualToString。所以你的代码可能如下所示:

NSString *contextString = (__bridge NSString *)context;
if ([contextString isEqualToString:cashBalanceKeyPath])
{
    //Do something
}
...

希望这有帮助!

答案 6 :(得分:-1)

如果你想比较字符串,你应该使用方法isEqualToString:

答案 7 :(得分:-1)

ARC在字符串方面通常不喜欢__strong,Apple建议你使用copy。