【问题标题】:Strange message when analyzing code in Objective-C在 Objective-C 中分析代码时出现奇怪的消息
【发布时间】:2012-11-16 08:20:09
【问题描述】:

我有一个数组,其中填充了复选框、滑块和 NSTextField 中的值。 请参见下面的 001。它的工作原理很明显。

但是,在分析我的代码时,我收到以下消息:

/Users/ronny/DEV/0200-ObjC4/Egg&Breakfast/Classes/TimeController.m:358:24: Argument to 'NSArray' method 'arrayWithObjects:' should be an Objective-C pointer type, not 'NSInteger'

我尝试了几种方法,例如将带有 intValue 的三行类型转换为 (NSInteger)。没有成功。知道有什么问题吗?

NSArray *myValues = [NSArray arrayWithObjects:
                    [isAppointment state],     //Checkbox
                    [boxForEver    state],     //Checkbox
                    [boxMakeSound  state],     //Checkbox
                    [tickTackFlag  state],     //Checkbox
                    [txtRemark   stringValue], //NSTextField
                    [slideHour      intValue], //Slider
                    [slideMin       intValue], //Slider
                    [slideSec       intValue], //Slider
                    [startAuto     state],     //Checkbox
                    nil];

【问题讨论】:

    标签: objective-c nsarray message code-analysis


    【解决方案1】:

    您不能将诸如intfloatNSInteger 之类的标量类型插入NSArray

    您必须插入指向NSObject 或子类的指针,如错误消息中所述。

    防止该缺点的常用方法是使用NSNumber

    例如:

    NSInteger foo = 42;
    [_myArray addObject:[NSNumber numberWithInteger:foo]];
    

    在最近的 Xcode 版本中,您可以使用一些语法糖

    [_myArray addObject:@42];
    

    【讨论】:

      【解决方案2】:

      所有调用stateintValue 的行都不正确。

      NSArray 只能保存对 Objective-C 对象的引用。但是stateintValue 返回NSInteger,这是long 的typedef(别名),它是C 原语,而不是Objective-C 对象引用。

      您需要将整数包装在NSNumber 对象中。如果您使用的是 Xcode 4.4 或更高版本,您可以使用新的 @(...) 包装语法将整数包装在 NSNumber 对象中。您还可以使用新的数组字面量语法@[...] 来构造您的数组。

      NSArray *myValues = @[
                          @([isAppointment state]),     //Checkbox
                          @([boxForEver    state]),     //Checkbox
                          @([boxMakeSound  state]),     //Checkbox
                          @([tickTackFlag  state]),     //Checkbox
                          [txtRemark   stringValue], //NSTextField
                          @([slideHour      intValue]), //Slider
                          @([slideMin       intValue]), //Slider
                          @([slideSec       intValue]), //Slider
                          @([startAuto     state]),     //Checkbox
                          ];
      

      【讨论】:

      • 很好的解释和建议。那工作得很好。谢谢大家。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多