对于任务跟踪应用程序,我使用了一个nsdictionary数组,其中包含有关任务的某些详细信息——持续时间等。
NSString *savedTaskName = addedTask.taskName;
NSString *savedTaskAccountName = addedTask.accountName;
NSString *savedTaskBillCode = addedTask.billCode;
NSString *savedTaskActivityCode = addedTask.activityCode;
NSNumber *savedTaskDuration = [NSNumber numberWithFloat:addedTask.taskDuration];
NSString *savedTaskTimeCode = addedTask.formattedTimeString;
NSDictionary *addedTaskData = [[NSDictionary alloc] initWithObjectsAndKeys:savedTaskName, kTaskName,
savedTaskAccountName, kAccountName,
savedTaskBillCode, kBillCode,
savedTaskActivityCode, kActivityCode,
savedTaskDuration, kTaskDuration,
savedTaskTimeCode, kTimeCode, nil];
也许我犯了一个新的错误,但是当我去添加addedTaskData到NSMutableArray时,数组只捕获字典的前三个值和键。
我疯了吗?为什么它没有完全传染?奇怪的是,请求字典键的计数将返回完整的数量。
initWithObjectsAndKeys
在到达nil值时停止。如果您有三个键/值,那么:
NSDictionary *addedTaskData = [[NSDictionary alloc] initWithObjectsAndKeys:savedTaskName, kTaskName,
savedTaskAccountName, kAccountName,
savedTaskBillCode, kBillCode,
savedTaskActivityCode, kActivityCode, // <-- THIS IS NIL
savedTaskDuration, kTaskDuration,
savedTaskTimeCode, kTimeCode, nil];
你可以这样写:
NSDictionary *addedTaskData = [[NSDictionary alloc] initWithObjectsAndKeys:savedTaskName, kTaskName,
savedTaskAccountName, kAccountName,
savedTaskBillCode, kBillCode,
(savedTaskActivityCode ?: [NSNull null]), kActivityCode, // Or @""
savedTaskDuration, kTaskDuration,
savedTaskTimeCode, kTimeCode, nil];
任何可能为nil的元素都应该像这样被保护。
如果你在一行中做了很多这样的操作,你可以声明一个局部null变量:
id null = [NSNull null];
NSDictionary *addedTaskData = [[NSDictionary alloc] initWithObjectsAndKeys:(savedTaskName ?: null), kTaskName,
(savedTaskAccountName ?: null), kAccountName,
(savedTaskBillCode ?: null), kBillCode,
(savedTaskActivityCode ?: null), kActivityCode, // Or @""
(savedTaskDuration ?: null), kTaskDuration,
(savedTaskTimeCode ?: null), kTimeCode, nil];
当不使用文字语法时,有可能会遇到nil终止问题。如果savedTaskDuration
实际上是nil
,那么它将切断NSDictionary的其余部分。
看看调试器,看看你是否有一个nil值在那里的某个地方。然后运行现代Objective-C重构工具,把那个傻瓜转换成NSDictionary字面量,这样你将来就不会再发生这种情况了。
对于引用,Literal语法如下:
NSDictionary *addedTaskData = @{@"Key" : @"Value", @"AnotherKey" : @"AnotherValue"};
尝试这样使用文字:
NSString *savedTaskName = addedTask.taskName;
NSString *savedTaskAccountName = addedTask.accountName;
NSString *savedTaskBillCode = addedTask.billCode;
NSString *savedTaskActivityCode = addedTask.activityCode;
NSNumber *savedTaskDuration = [NSNumber numberWithFloat:addedTask.taskDuration];
NSString *savedTaskTimeCode = addedTask.formattedTimeString;
// Use literals and see your code doesn't crash
NSDictionary *addedTaskData = @{kTaskName: savedTaskName,
kAccountName: savedTaskAccountName,
savedTaskBillCode: savedTaskBillCode,
savedTaskActivityCode: savedTaskActivityCode
savedTaskDuration: savedTaskDuration
savedTaskTimeCode: savedTaskTimeCode};
确保你的代码不会崩溃