NSNumber声称是NSString

时间:2015-09-11 08:28:26

标签: ios objective-c

我在这行代码中收到警告Comparison of distinct pointer types ('NSString *' and 'NSNumber *')

if(beacon.beaconIdentifier == self.identifier) {
  // do something
}

两者都应包含NSNumber。对象beacon是CLBeacon。 self.identifier是NSNumber。其他可能相关的代码:

CLBeacon类别

@interface CLBeacon ();
@property(nonatomic, strong) NSNumber *beaconIdentifier;
@end

static char const *const MyBeaconIdentifier = "MyBeaconIdentifier";

....

- (CLBeacon *)initWithJSON:(NSDictionary *)json {
  self = [super init];
  if (self) {
    ...
    self.beaconIdentifier = json[@"id"];
  }
  return self;
}

- (void) setBeaconIdentifier:(NSNumber *)beaconIdentifier {
  objc_setAssociatedObject(self, MyBeaconIdentifier, beaconIdentifier, OBJC_ASSOCIATION_RETAIN);
}

- (NSNumber *)beaconIdentifier {
   return objc_getAssociatedObject(self, MyBeaconIdentifier);
}

json[@"id"]始终只包含数字。除了警告,一切都按预期运行。是什么导致我的问题以及可能解决的问题?

感谢几个很好的回复,我设法解决了警告。不过,如果可能的话,我想知道是什么原因造成的。

beacon.beaconIdentifier.class记录_NSCFNumber,就像self.identifier一样。

1 个答案:

答案 0 :(得分:1)

你说json[@"id"]包含一个数字,但在编译时并不知道。因此警告。它仅在运行时由编译器识别为NSNumber

要检查NSNumber的相等性,请尝试使用此代码

if([beacon.beaconIdentifier isEqualToNumber:self.identifier]) {
  // do something
}