objective-c - NSDictionary 如何处理 NIL 对象?

标签 objective-c ios nsdictionary

考虑下面的代码。本质上,我们得到 2 个字符串,然后我们将这些值添加到 NSDictionary。

但是,我遇到了一个奇怪的错误。当 fbAccessTokenKey 为 0x0(或 nil)时,也不会添加 twitterToken。

NSString *fbAccessTokenKey=[[UserStockInfo sharedUserStockInfo] getFBAccessTokenKey];
NSString *twitterToken=[[UserStockInfo sharedUserStockInfo] getTwitterAccessTokenKey];

NSDictionary *params= [[NSDictionary alloc] initWithObjectsAndKeys:
                       fbAccessTokenKey, @"fb_access_token", 
                       twitterToken, @"twitter_access_token", 
                       nil
                       ];

为什么会这样,解决这个问题的好方法是什么?

最佳答案

nil 用作标记“参数结尾”列表的“哨兵”。如果 twitterToken 为 nil,则运行时将遍历您的参数,一旦到达 twitterToken,它就会认为它已到达对象列表的末尾,并且键。这是由于 C/Obj-C 在涉及列表参数时的实现方式。

另一种安全的方法是使用 NSMutableDictionary,并检查您的值是否为非 nil,然后像这样将它们添加到可变字典中:

NSString *fbAccessTokenKey = [[UserStockInfo sharedUserStockInfo] getFBAccessTokenKey];
NSString *twitterToken = [[UserStockInfo sharedUserStockInfo] getTwitterAccessTokenKey];

NSMutableDictionary *params = [NSMutableDictionary dictionary];
if (fbAccessTokenKey) [params setObject:fbAccessTokenKey forKey:@"fb_access_token"];
if (twitterToken) [params setObject:twitterToken forKey:@"twitter_access_token"];

有关更多技术信息,有一篇关于 Cocoa with Love 的好文章:http://cocoawithlove.com/2009/05/variable-argument-lists-in-cocoa.html

关于objective-c - NSDictionary 如何处理 NIL 对象?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6824999/

相关文章:

ios - 用于过滤具有多个条件的列表的最佳选择算法?

ios - 非常缓慢地将 Objc 迁移到 swift 代码

javascript - Cordova,onResume() 仅在我包含 alert() 时有效

iphone - 隐藏键盘的实用方法

ios - NSDictionary获取对象列表中的属性- objective-c

cocoa - 用于存储没有关联值的键的数据结构

ios - 如何在 Swift 项目中使用 BSKeyboardControls?

iphone - 设备上的 NSTimer 比模拟器上的慢

iphone - 缩小然后关闭 UIView 的问题

Objective-C - 将项目从 NSDictionary 添加到 NSMutableDictionary