试图在 NSMutableDictionary 中设置 Number 类型的对象并得到奇怪的警告

Posted

技术标签:

【中文标题】试图在 NSMutableDictionary 中设置 Number 类型的对象并得到奇怪的警告【英文标题】:Trying to setObject of type Number in NSMutableDictionary and get strange warning 【发布时间】:2012-02-26 20:55:10 【问题描述】:

我正在尝试在 NSMutableDictionary 中设置对象并收到奇怪的警告,听到的是代码

if ([errorCode intValue] != -1) 
    NSLog(@"after getting data back");
    NSString *userName = [[protocol3Replay valueForKeyPath:uName]autorelease];
    NSString *userPassword = [[protocol3Replay valueForKeyPath:pass]autorelease];
    NSNumber *UserId = [[protocol3Replay valueForKeyPath:@"Session.user_id"]autorelease];
    NSNumber *customerId = [[protocol3Replay valueForKeyPath:@"Session.customer_id"]autorelease];

    BOOL b = [file checkFile];
    NSLog(@"after check file exists");
    if (b == YES) 
       NSLog(@"file exist"); 
        NSMutableDictionary *fileDic = [[[NSMutableDictionary alloc]init]autorelease];

        fileDic = [file readFile];

        [fileDic setObject:[NSNumber numberWithInteger:UserId] forKey:@"user_id"];
        [fileDic  setObject:token forKey:@"device_token"];
        [fileDic setObject:[NSNumber numberWithInteger:customerId] forKey:@"customer_id"];
        [fileDic setObject:userName forKey:@"user_name" ];
        [fileDic setObject:userPassword forKey:@"user_password" ];

    

减弱的 si:警告:语义问题:指向整数转换的不兼容指针将“NSNumber *”发送到“NSInteger”(又名“int”)类型的参数

是这样吗?

【问题讨论】:

帮助我们,错误在哪一行?不明白的错误信息怎么办? 顺便说一句,你的代码:'NSMutableDictionary *fileDic = [[[NSMutableDictionary alloc]init]autorelease]; fileDic = [文件读取文件];'有缺陷。第二行分配[file readFile] 的结果,使第一行中fileDic 的分配无关紧要。建议:使用ARC,ios 4及以上版本可用。 这对我有用,谢谢 Zaph 【参考方案1】:

您将UserID 传递给numberWithInteger:,这需要NSInteger。这与setObject: 无关。您可能想复制UserID 或直接将UserID 传递给setObject:

【讨论】:

【参考方案2】:

UserID 是一个 OBJECT,numberWithInteger 的参数是一个 NSInteger,它只是一个整数。 NSInteger 不是 NSNumber 或 NSObject 的子类。不是指针,是整数。

所以你的声明 NSNumber *UserID = ... 应该是 NSInteger userID(没有 * 因为它不是一个指针)。

附言这只是解决问题的一种可能方法。

【讨论】:

试图写:NSNumber UserId = [[protocol3Replay valueForKeyPath:@"Session.user_id"]autorelease];它被标记为错误 那是因为,正如我所说,NSNumber 不是一个对象,它是一个整数。 Autorelease 不是整数的方法。其次,在您调用 valueForKey 然后发送消息 autorelease 的每个语句中都是不正确的。您只向保留的对象发送自动释放。

以上是关于试图在 NSMutableDictionary 中设置 Number 类型的对象并得到奇怪的警告的主要内容,如果未能解决你的问题,请参考以下文章

在 iOS 中将 NSMutableDictionary 添加到 NSMutableArray 时崩溃?

为啥 NSString 的 NSArray 可以作为 NSMutableDictionary 的键?

当键看起来像一个 int 时如何访问 NSMutableDictionary?

在 UITableView 中过滤 NSMutableDictionary 数据

如何在 NSMutableDictionary 中保留部分分数

在 Interface Builder 中访问 NSMutableDictionary 值