6

迁移到 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 *)

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

4

8 回答 8

2

我不能告诉你确切的原因,但如果你交换比较的顺序,你不会收到警告或错误:

if (context == &cashBalanceKeyPath) {
    // ...      
}
于 2013-07-02T19:40:25.193 回答
2

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

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

这似乎为编译器提供了它所需要的一切,而无需任何桥接。

于 2013-07-02T19:45:40.797 回答
1

如果您去掉__strong错误消息中的 ,就会更清楚发生了什么:

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

&cashBalanceKeyPath是一个指向 NSString 对象或 a 的指针NSString**,而 context 被强制转换为一个NSString*或一个普通的 NSString 对象(它不是)。

因此,要解决此问题,请将演员表更改为(NSString * const *),显然需要 const 来安抚 ARC。

于 2013-07-02T19:37:37.013 回答
0

as cashBalanceKeyPathis a pointer and contextis a pointer 比较这两者的正确方法是:

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

于 2013-07-02T19:46:35.503 回答
0

整个问题可能可以通过写作来避免

static int cashBalanceKeyPathContext = 0;

并使用 &cashBalanceKeyPathContext 作为上下文。

于 2014-02-24T11:13:21.667 回答
-1

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

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

希望这可以帮助!

于 2013-07-02T19:40:52.673 回答
-1

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

于 2013-07-02T23:47:55.893 回答
-1

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

于 2013-07-03T07:30:27.913 回答