Предупреждение о создании указателя из целого числа без приведения - требуется пояснение - PullRequest
1 голос
/ 05 июня 2011

У меня есть этот код:

- (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];   
} 

И я получаю это предупреждение:

предупреждение: передача аргумента 3 'showWhileExecuting: onTarget: withObject: animated:' делает указательот целого числа без приведения

Может кто-нибудь объяснить, пожалуйста, что я делаю здесь не так?Может ли кто-то также кратко объяснить ситуацию с целыми числами в Objective-C, пришедшими из Java, я нахожу странным, что они так запутаны в использовании.

Ответы [ 4 ]

3 голосов
/ 05 июня 2011

Проблема в том, что showWhileExecuting:onTarget:withObject:animated: принимает объект в качестве третьего аргумента.Чтобы обойти это, вы можете обернуть целые числа как объекты, используя класс NSNumber

[NSNumber numberWithInt:i]

. Затем вам придется развернуть аргумент в методе loadData:, вызвав

[argument intValue]
2 голосов
/ 05 июня 2011

Видимо, вы указали целое число (int i) вместо указателя объекта (тип id).Это не безопасно.Вместо этого используйте NSNumber.

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

[HUD showWhileExecuting:@selector(loadData:) onTarget:self withObject:i animated:YES];
2 голосов
/ 05 июня 2011

Метод принимает объект в качестве третьего аргумента (withObject), но вместо этого вы передали int.

0 голосов
/ 05 июня 2011

Все ответы выше являются «правильными». То есть будь хорошим мальчиком и используй и NSNumber для передачи значения.

Однако ... следующее будет работать

"Черт возьми, компилятор, я умнее тебя" (приведите ваше целое число, совершенно недопустимый объект, к id)

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

Я предполагаю (вы не сказали), что ваш метод загрузки данных выглядел так:

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

Вы увидите код, подобный этому, и это единственная причина, по которой я упомянул это. Вы должны быть знакомы с этим. кто-то думает, что сохранение 1 выделенного объекта сделает его код эффективным; не беспокойтесь о распределении объектов, а оборачивайте его в NSNumber, как показано выше

большинство компиляторов C справятся с этим правильно, но это не гарантируется

...