开发者

Warning about making pointer from integer without a cast -- explanation needed

开发者 https://www.devze.com 2023-03-11 01:13 出处:网络
I have this code: - (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath {

I have this code:

- (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(loadDat开发者_高级运维a:) onTarget:self withObject:i animated:YES];   
} 

And I get this warning:

warning: passing argument 3 of 'showWhileExecuting:onTarget:withObject:animated:' makes pointer from integer without a cast

Can somebody please explain what I'm doing wrong here? Could someone also briefly explain the situation with ints in Objective-C, coming from Java I find it odd that they are so confusing to use.


The problem is that showWhileExecuting:onTarget:withObject:animated: takes an object as its third argument. To get aroung this, you can wrap integers as objects using the NSNumber class

[NSNumber numberWithInt:i]

You will then have to unwrap the argument in the loadData: method by calling

[argument intValue]


The method takes an object as a third argument (withObject), but you passed an int instead.


Apparently, you provided an integer(int i) instead of an object pointer(type of id). It is not safe. Use NSNumber instead.

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

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


All of the answers above are the "correct" ones. I.e. be a good boy and use and NSNumber to pass the value.

However, … the following will work

"damn you, compiler, i'm smarter than you are:" (cast your integer, totally not a valid object, to id)

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

i'm guessing (you didn't say), that your load data method looked like this:

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

you will see code like this, which is the only reason i mentioned it. you should be familiar with it. someone thinks that saving 1 object allocation is going to make their code efficient; don't sweat object allocations, and wrap it up in an NSNumber as shown above

most C compilers will handle this correctly, but it's not guaranteed

0

精彩评论

暂无评论...
验证码 换一张
取 消