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

时间:2017-05-30 11:37:49

标签: ios objective-c selector

我想使用一个选择器在我的视图控制器中调用一个func,我想要将一个通道的数量传递给func。这需要是一个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]];

2 个答案:

答案 0 :(得分:3)

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

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

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

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

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

答案 1 :(得分:1)

该方法使用对象 表示。不幸的是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 ...