【问题标题】:Problems with adding objects to NSMutableDictionary向 NSMutableDictionary 添加对象的问题
【发布时间】:2011-12-28 16:22:18
【问题描述】:

我正在制作一个 iPhone 应用程序,我正在从服务器加载信息。我将 NSURLRequest 发送到服务器并取回一个 NSString 值。这工作正常,我得到的价值是正确的。问题是,当我尝试将变量的值添加到我用来存储值的 NSMutableDictionary 时,它不起作用。当我在 Xcode 中调试并查看 NSMutableDictionary 的值时,它会在我添加值的行之后显示 0 个键/值对。这是我的代码的样子:

    NSArray *varsToLoad = [fixedData objectForKey:@"varsToLoad"];
    NSError *error;
    for(NSString *var in varsToLoad){
        NSMutableURLRequest *request = [NSMutableURLRequest requestWithURL: someURL]];
        [request setHTTPMethod:@"POST"];
        NSMutableString *file = [NSMutableString stringWithString:@"file="];
        NSString *file1 = [file stringByAppendingString:var];
        NSString *file2 = [file1 stringByAppendingString:@".txt"];
        [request setHTTPBody:[file2 dataUsingEncoding:NSUTF8StringEncoding]];
        NSData *response = [NSURLConnection sendSynchronousRequest:request returningResponse:nil error:&error];
        NSString *value = [[NSString alloc] initWithData:response encoding:NSUTF8StringEncoding];
        [varsLoaded setObject:value forKey:var];
    }

varsLoaded 在@implementation 中声明,是一个 NSMutableDictionary。

【问题讨论】:

    标签: objective-c xcode nsmutabledictionary


    【解决方案1】:

    问题可能是你没有通过说self.varsLoaded = [NSMutableDictionary dictionary];来初始化你的varsLoaded

    因此,您将对象添加到不存在的字典中,但您没有遇到异常,因为这在 Objective-c 中是正常的 :)

    【讨论】:

    • 我也遇到过这种情况,但如果是这种情况,你不会在调试器中得到 0 个键/值对,你会得到 nil。
    • 不,它在调试器窗口中将未初始化的字典显示为 0 键/值对。我测试过了。
    • davsan, @jrturton :应该保留响应吗?
    • 我认为 NSString 的 init 方法应该在自己的实现中保留它。因为否则它会让 SDK 用户感到困惑,就像你应该在使用它来初始化 NSString 之前保留 NSData 并且你不应该在释放 NSString 之前释放那个 NSData 等等......所以我认为不保留响应是可以的.
    【解决方案2】:

    在进一步处理之前,您应该真正检查响应。把它包装成这样:

    if (response == nil) {
        // Check for problems
    
    }
    else {
         NSString *value = [[NSString alloc] initWithData:response encoding:NSUTF8StringEncoding];
            [varsLoaded setObject:value forKey:var];
    }
    

    【讨论】:

      【解决方案3】:

      将代码的第一行从NSArray 更改为NSMutableArray,看看你是否有更好的运气。

      在其他地方将varsLoaded 声明为NSMutableDictionary 并不重要...在上面代码的本地上下文中,编译器认为varsToLoad 是一个不可变数组,甚至可能不是编译你的setObject: forKey: 行。您在运行时没有在构建日志或控制台中收到警告??

      【讨论】:

      • 根据代码 varsToLoad 和 VarsLoaded 是不同的对象。 varsLoaded 可能是一个 NSMutableDictionary。顺便说一句,downvote 不是来自我
      猜你喜欢
      • 1970-01-01
      • 2011-06-10
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多