NSNumber numberWithInt:nnid错误

时间:2015-05-11 01:39:48

标签: objective-c nsinteger

我收到此错误:

  

隐式转换失去整数精度:'NSInteger'(又名'long')到'int'

并指向nnid

我该如何解决这个问题?

// databaseden haberleri cek

-(NSMutableArray *)getNews: (NSInteger)nnid
{
    [database open];
    FMResultSet *results = [database executeQuery:
        @"SELECT * FROM news WHERE newsubid = ? order by ndate desc limit 0,50",
        [NSNumber numberWithInt:nnid]];

    NSMutableArray *tempdata2 = [NSMutableArray new];
    while ([results next]) {
        GundemNews* newsData = [GundemNews newsWithDBResultSet:results];
        [tempdata2 addObject:newsData];
    }

2 个答案:

答案 0 :(得分:0)

警告消息告诉您问题:您有一个NSInteger,并且您尝试将其作为int传递。不要那样做。

为什么不呢?好吧,在您的平台上,NSIntegerlong的typedef - 因此警告显示'NSInteger' (aka 'long')。并且long是64位整数,int是32位。因此,NSInteger可以保留数字4294967297,但当您将其作为int传递时,它将以1结尾。或者更糟糕的是,3221225473最终将为-1073741823。

在其他平台上,NSInteger可能是int的typedef。但是,虽然这意味着你躲过这段代码,但它仍然不是好代码 - 只要你在另一个平台上编译它就会神秘地破解代码。

只需使用Using DNS to redirect to another URL with a path代替-numberWithInt:,就像这样:

FMResultSet *results = [database executeQuery:
    @"SELECT * FROM news WHERE newsubid = ? order by ndate desc limit 0,50",
    [NSNumber numberWithInteger:nnid]];

正如文档所说,-numberWithInteger:“[c]会创建并返回包含给定值的NSNumber对象,并将其视为NSInteger。”

答案 1 :(得分:0)

您只需更改行

即可
FMResultSet *results = [database executeQuery:@"SELECT * FROM news WHERE newsubid = ? order by ndate desc limit 0,50", [NSNumber numberWithInt:nnid]];

FMResultSet *results = [database executeQuery:@"SELECT * FROM news WHERE newsubid = ? order by ndate desc limit 0,50", [NSNumber numberWithInteger:nnid]];

出现警告是因为您尝试将NSInteger值传递给期望Int值的方法。