ARC 不允许将 'NSUInteger'(又名 'unsigned long')隐式转换为 'id'?

Implicit conversion of 'NSUInteger' (aka 'unsigned long') to 'id' is disallowed with ARC?

我想使用选择器在我的视图控制器中调用函数,我想将通道号传递给函数。这需要是一个 Int,但我无法让选择器正确响应。我该如何解决这个问题?

- (void)sendBusGetPar {
      [self.viewController performSelector:@selector(getBusParams:) withObject: self.bus.channelNumber];
 }

这是控制器中的接收函数

- (void)getBusParams:(NSInteger)busChannel {
    [[self tcpControl] sendMessage:cmd(GETPAR) Module:module(BUS) ModuleIndex:busChannel
                           Section:section(CONTROL) SectionIndex:0
                              Unit:unit(FADER) UnitIndex:0
                             Param:param(POSITION) Value:0];
}

我知道它与转换和类型有关,但我不明白为什么在这种情况下我不能将频道号作为 Int 发送?

我也试过这个但是选择器没有响应所以我认为它错了?

[self.viewController performSelector:@selector(getBusParams:) withObject: [NSNumber numberWithInteger:self.bus.channelNumber]];

方法说 withObject。不幸的是 NSUInteger 不是对象。

一个合适的解决方案是从标量整数创建一个 NSNumber 对象并传递它。

[self.viewController performSelector: @selector(getBusParams:) 
                          withObject: @(self.bus.channelNumber)];

在接收端你需要用 unsignedIntegerValue 属性.

- (void)getBusParams:(NSNumber *)busChannel
    [[self tcpControl] sendMessage:cmd(GETPAR) 
                            Module:module(BUS) 
                       ModuleIndex:busChannel.unsignedIntegerValue ...

performSelector: 不应滥用于正常的方法调用。

为什么不直接调用方法呢?

[self.viewController getBusParams:self.bus.channelNumber];

如果您的 viewController 具有通用类型,请将其转换为正确的类型:

[(MyViewController *) self.viewController getBusParams:self.bus.channelNumber];