关于在没有强制转换的情况下从整数制作指针的警告

时间:2011-06-05 16:12:02

标签: objective-c cocoa-touch ios casting int

我有这段代码:

- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath {
    // Navigation logic
    NSLog(@"didSelectRowAtIndexPath");

    //The hud will dispable all input on the view
    HUD = [[MBProgressHUD alloc] initWithView:self.view];

    // Add HUD to screen
    [self.view addSubview:HUD];

    // Regisete for HUD callbacks so we can remove it from the window at the right time
    HUD.delegate = self;

    HUD.labelText = @"Loading Events, Please Wait..";

    int i = indexPath.row;

    //Show the HUD while the provided method executes in a new thread
    [HUD showWhileExecuting:@selector(loadData:) onTarget:self withObject:i animated:YES];   
} 

我收到了这个警告:

  

警告:传递'showWhileExecuting:onTarget:withObject:animated:'的参数3,使得整数指针没有强制转换

有人可以解释我在这里做错了什么吗?有人还可以简单地用Objective-C中的int来解释这种情况,来自Java我觉得奇怪的是它们使用起来很混乱。

4 个答案:

答案 0 :(得分:3)

问题是showWhileExecuting:onTarget:withObject:animated:将对象作为其第三个参数。为了解决这个问题,您可以使用NSNumber类

将整数包装为对象
[NSNumber numberWithInt:i]

然后,您必须通过调用

来打开loadData:方法中的参数
[argument intValue]

答案 1 :(得分:2)

该方法将对象作为第三个参数(withObject),但您传递了int

答案 2 :(得分:2)

显然,您提供了一个整数(int i)而不是对象指针(id的类型)。这不安全。请改用NSNumber。

int i;
...
NSNumber * numberI = [NSNumber numberWithInt:i];

[HUD showWhileExecuting:@selector(loadData:) onTarget:self withObject:i animated:YES];

答案 3 :(得分:0)

以上所有答案都是“正确的”。即做一个好孩子并使用NSNumber来传递价值。

然而,......以下内容将起作用

“该死的,编译器,我比你聪明:” (将您的整数,完全不是有效对象,转换为id

    [HUD showWhileExecuting:@selector(loadData:) 
                   onTarget:self 
                 withObject:(id)i 
                   animated:YES];   

我猜(你没说),你的加载数据方法看起来像这样:

- (void)loadData:(int)i { …

看到这样的代码,这是我提到它的唯一原因。 你应该熟悉它。 有人认为保存1个对象分配将使他们的代码有效;不要冒汗对象分配,并将其包装在NSNumber中,如上所示

大多数C编译器都会正确处理,但不能保证