我有一个非常有趣的问题。

在我的一个类中,我声明了一个非常简单的实例方法-(NSDictionary)dictionary;
以这种方式实现:

- (NSDictionary *)dictionary {
    return [NSDictionary dictionaryWithObjectsAndKeys:
                              self.userID, @"id",
                              self.userName, @"name",
                              self.userSurname, @"sName",
                              self.userNickname, @"nName",
                              self.userPassword, @"pwd",
                              [NSNumber numberWithDouble:[self.userBirthday timeIntervalSince1970] * 1000], @"birthday",
                              self.userSex, @"sex",
                              self.userEmail, @"email",
                              self.userLanguage, @"locale",
                              [NSNumber numberWithLongLong:self.userCoin], @"coin",
                              self.userRate, @"rate",
                              [NSNumber numberWithDouble:self.userCoordinate.latitude], @"lat",
                              [NSNumber numberWithDouble:self.userCoordinate.longitude], @"lon",
                              self.userPlaces, @"userPlaces",
                              nil];
    }

声明此方法后,我的返回字典中没有@“userPlaces”键(self.userPlace很明显是虚荣的,里面装满了对象)。

所以我改变了我的方法,像这样:
- (NSDictionary *)dictionary {
    NSMutableDictionary *toReturn = [NSMutableDictionary dictionary];
    [toReturn setValue:self.userID forKey:@"id"];
    [toReturn setValue:self.userName forKey:@"name"];
    [toReturn setValue:self.userSurname forKey:@"sName"];
    [toReturn setValue:self.userNickname forKey:@"nName"];
    [toReturn setValue:self.userPassword forKey:@"pwd"];
    [toReturn setValue:[NSNumber numberWithDouble:[self.userBirthday timeIntervalSince1970] * 1000] forKey:@"birthday"];
    [toReturn setValue:self.userSex forKey:@"sex"];
    [toReturn setValue:self.userEmail forKey:@"email"];
    [toReturn setValue:self.userLanguage forKey:@"locale"];
    [toReturn setValue:[NSNumber numberWithLongLong:self.userCoin] forKey:@"coin"];
    [toReturn setValue:self.userRate forKey:@"rate"];
    [toReturn setValue:[NSNumber numberWithDouble:self.userCoordinate.latitude] forKey:@"lat"];
    [toReturn setValue:[NSNumber numberWithDouble:self.userCoordinate.longitude] forKey:@"lon"];
    [toReturn setValue:self.userPlaces forKey:@"userPlaces"];

    return [NSDictionary dictionaryWithDictionary:toReturn];
}

现在所有键都存在于输出字典中!!!!

这个问题使我疯狂地理解,但是我的问题是...
有什么原因可以使第二种方法比第一种更好?

我没有找到原因。

最佳答案

[NSDictionary dictionaryWithObjectsAndKeys:在找到nil值时停止添加对象。

因此,您尝试在第一个代码中添加的对象最有可能是nil。

10-07 19:55
查看更多