【问题标题】:Invalid Integer to pointer conversion in objective c目标c中的无效整数到指针转换
【发布时间】:2011-07-22 11:24:14
【问题描述】:

当我构建此代码时,我收到警告说无效的整数到指针的转换。 但是当我运行应用程序时,它会崩溃.....

谁能帮助我...我在 withObject:[sender tag] 处收到警告

我有 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];
}

【问题讨论】:

    标签: iphone objective-c cocoa-touch nsinteger


    【解决方案1】:

    [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];
    

    我不确定其中任何一个,但请告诉我是否可行。

    【讨论】:

    • 第一个答案+1,第二个答案-1;你不知道框架是否会在你的对象上调用retain(如果它只是一个 int 会严重失败!)
    • 我尝试过的两种解决方案虽然我没有收到警告但在第一种情况下应用程序崩溃....而在第二种情况下我收到 EXC_BAD_EXECUTION 错误....
    • 你好 Praveen,第一个只是让我的应用程序崩溃....你能给我另一个解决方案吗....
    • 您可以更改您的frontButtonScaleUp: 函数以接收NSNumber。之后它不应该崩溃。请注意还将另一行代码更改为[self frontButtonScaleUp:[NSNumber numberWithInt:[sender tag]]];。然后在你的函数体中,你可以像这样从参数中获取整数值:NSInteger intValue = [functionArgument integerValue];.
    • 我也试过了,一旦我更改了 .h 文件 - (void)frontButtonScaleUp: (NSNumber) tag;我收到错误“接口类型 NSNumber 不能按值传递。”
    【解决方案2】:

    您将无法像在代码中那样获得按钮的标签。这样做得到按钮然后使用它,你的问题就解决了

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

    【讨论】:

    • 我使用了与你给出的相同的代码,但我仍然在 withObject 处收到警告:不兼容的整数到指针转换将'int'发送到'id'类型的参数......谁能告诉我我应该通过 withObject...???????
    • 使用数据类型'id'而不是int,然后用它作为; id Btag = button.tag;
    【解决方案3】:

    嗯,不知道你的方法 frontButtonScaleUp 做了什么,我无法给出明确的答案,但我可以告诉你 - 标签 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

    我猜您是在某个延迟之后尝试在点击按钮后增加按钮的大小?您已经有了按钮的 id,它是您函数中的 sender 参数。只需将其传递到您的 frontButtonScaleUp 方法中,您就应该可以通过编译器警告和 *EXC_BAD_ACCESS* 异常。

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

    【讨论】:

    • 是的,我想增加按钮的大小。所以我的frontButtonScaleUp获取按钮的引用,然后我使用适用于不同项目的简单代码......但在这里我想要2个按钮使用相同的代码..这就是为什么我直接使用发送器而不是按钮引用......
    • @Dhiren Shah - 我就是这么想的。您是否尝试过我的答案中的代码?您应该能够只传递 sender 而不是 [sender tag] 并且您的功能将起作用。
    • 我也尝试过使用 Sender,但是当我的代码进入其他部分时......我的应用程序崩溃......只是因为 withObjects......
    • @Dhiren Shah - 请修改您的原始问题与您遇到的崩溃(当您使用 sender 而不是 [sender tag] 时) ,以及 frontButtonScaleUp. 的实现
    【解决方案4】:

    我对我的代码做了一些修改,如下所示:

    - (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 的问题....

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2016-03-30
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-02-23
      相关资源
      最近更新 更多