NSNumber无法识别的选择器

时间:2013-10-22 09:36:38

标签: ios exception nsstring nsnumber

以下代码

  NSMutableString *a = [[NSMutableString alloc] init];
  NSMutableString *pivot     =[[NSMutableString alloc] init];
    int i= 0;

    for ( i = 0; i < [columns count]; i++)
    {


        if ([[[data objectForKey:pivot] class] isKindOfClass:[NSNumber class]])
        {
             sqlite3_bind_int(sqlStatement, i+1,[[columns objectAtIndex:i] integerValue]);

        }
        else
        {
            // NSLog(@"kind of class %@ %@",NSStringFromClass([[data objectForKey:pivot] class]) ,[data objectForKey:pivot]);
            [pivot setString:[columns objectAtIndex:i]];
            [a setString:(NSString*)[data objectForKey:pivot]];
            sqlite3_bind_text(sqlStatement, i+1, [a UTF8String], -1, 0);

        }
    }
    a     = nil;
    pivot = nil;

引发异常

 kind of class __NSCFConstantString
  -[__NSCFNumber length]: unrecognized selector sent to instance 0xc94c240

但是日志明确指出[data objectForKey:pivot]是一个字符串! test变量始终为0!

我检查了调试,实际上[data objectForKey:pivot]是一个数字。事实上,我使用if(未显示)来检查它是否是数字。显然,if失败了......

1 个答案:

答案 0 :(得分:1)

当您尝试以这种方式格式化时,您正在将class转换为字符串,尝试使用NSStringFromClass(class)从类中获取字符串名称:

 id pivotObject = [data objectForKey:pivot];
 NSLog(@"kind of class %@", NSStringFromClass([pivotObject class]));
 if ([pivotObject isKindOfClass:[NSString class]]) {
     [pivot setString:[columns objectAtIndex:i]];
     [a setString:pivotObject];
 }

此外,isKindOfClass:还会返回BOOL而不是int

但最重要的是

我认为[pivot setString:[columns objectAtIndex:i]]行中的错误,因为在这里你更改了pivot变量然后从数据中检索它,但是由于pivot变量被更改,你从数据字典中请求一个不同的键。这将获得另一个值。我的代码我只从数据中获取一次pivotData。