迁移到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 *)
如何进行转换?提前致谢。
答案 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。