Неверное преобразование целого числа в указатель в цели c - PullRequest
0 голосов
/ 22 июля 2011

Когда я строю этот код, я получаю ПРЕДУПРЕЖДЕНИЕ, что НЕВЕРНОЕ целочисленное значение для преобразования указателя.Но когда я запускаю приложение, оно получает Crash .....

Может ли кто-нибудь помочь мне ... Я получаю предупреждение с withObject: [тег отправителя]

У меня есть метод frontButtonScaleUp, которыйпринимает аргумент (NSIngeter) ... а также тег возвращает значение NSInteger ...

- (IBAction)frontButtonReleased:(id)sender
{
    const double delay = 0.3;
    double elapsed = CACurrentMediaTime() - tapStartTime;;
    if (elapsed >= delay)
        [self frontButtonScaleUp:[sender tag]];
    else
        [self performSelector:@selector(frontButtonScaleUp) withObject:[sender tag] afterDelay:delay - elapsed];
}

Ответы [ 4 ]

5 голосов
/ 22 июля 2011

[sender tag] является NSInteger, и вы не можете передать его в performSelector:withObject:afterDelay:, так как он ожидает, что там будет объект. Что вы можете сделать, так это вызвать функцию:

[self performSelector:@selector(frontButtonScaleUp) withObject:[NSNumber numberWithInt:[sender tag]] afterDelay:delay - elapsed];

или попробуйте

[self performSelector:@selector(frontButtonScaleUp) withObject:(id)[sender tag] afterDelay:delay - elapsed];

Я не уверен ни в одном из них, но, пожалуйста, дайте мне знать, если это работает.

0 голосов
/ 29 июля 2011

Я сделал свой код с небольшими изменениями, как показано ниже:

- (IBAction)frontButtonReleased:(id)sender
{
    const double delay = 0.4;
    double elapsed = CACurrentMediaTime() - tapStartTime;;
    UIButton *btn = (UIButton *)sender;

    if (isBtnOneTurnOver || isBtnTwoTurnOver)
    {
        if ([btn tag] == 1)
        {
            if (elapsed >= delay)
                [self btnOneScaleUp];
            else
                [self performSelector:@selector(btnOneScaleUp) withObject:nil afterDelay:(delay - elapsed)];
        }
        else
        {
            if (elapsed >= delay)
                [self btnTwoScaleUp];
            else
                [self performSelector:@selector(btnTwoScaleUp) withObject:nil afterDelay:(delay - elapsed)];
        }
    }
}

здесь я сделал два новых метода для каждой кнопки, и у обоих нет аргументов, чтобы ... чтобы была решена проблема передачи withObject ....

0 голосов
/ 22 июля 2011

Хммм, не зная, что делает ваш метод frontButtonScaleUp , я не могу дать однозначного ответа, но могу сказать вам следующее - атрибут tag NSView - это простое int без гарантии того, что оно является полезным значением. Это удобный атрибут класса, который предоставляется разработчикам для использования практически так, как они хотят. Ни в коем случае не следует путать этот атрибут с указателем!

В этой строке кода:

if (elapsed >= delay) 
    [self frontButtonScaleUp:[sender tag]];

Я не могу комментировать, потому что, как я уже сказал, я не знаю, что такое определение или реализация frontButtonScaleUp . Но я предполагаю, что вы ожидаете какой-то id и вместо этого передаете int. Ваш код почти наверняка взорвется здесь, если вам не повезет, он сделает это наугад.

Эта строка:

else 
    [self performSelector:@selector(frontButtonScaleUp) withObject:[sender tag afterDelay:delay - elapsed];

Определенно неправильно - еще раз, int! = id .

Я предполагаю, что вы пытаетесь увеличить размер кнопки после ее нажатия, после некоторой задержки? У вас уже есть идентификатор кнопки, это параметр sender в вашей функции. Просто передайте это в ваш метод frontButtonScaleUp , и вы должны пройти предупреждение вашего компилятора и исключение * EXC_BAD_ACCESS *.

if (elapsed >= delay) 
    [self frontButtonScaleUp:[sender]];
0 голосов
/ 22 июля 2011

Вы не сможете получить тег кнопки, как вы это сделали в своем коде. Сделайте это, чтобы получить кнопку, а затем используйте ее, ваша проблема будет решена

- (IBAction)frontButtonReleased:(id)sender
{

UIButton *button = (UIButton *)sender;
        int Btag = button.tag;

const double delay = 0.3;
double elapsed = CACurrentMediaTime() - tapStartTime;;
if (elapsed >= delay)
    [self frontButtonScaleUp:Btag];
else
    [self performSelector:@selector(frontButtonScaleUp) withObject:Btag afterDelay:delay - elapsed];
}
...