慎用dictionaryWithObjectsAndKeys方法

本文深入探讨了Objective-C中使用NSDictionary的潜在错误,特别是在处理含有nil值的对象时,如何避免因误判结束标志而导致的数据丢失。通过具体实例,揭示了这一隐蔽bug的成因,并提供了预防措施。

分享一下我老师大神的人工智能教程!零基础,通俗易懂!http://blog.youkuaiyun.com/jiangjunshow

也欢迎大家转载本篇文章。分享知识,造福人民,实现我们中华民族伟大复兴!

               

 

有这样一段代码:

NSDictionary* items2=[NSDictionary dictionaryWithObjectsAndKeys:

        [d objectForKey:@"GZDBH"],@"工作单编号",

        [d objectForKey:@"LDSJ"],@"来电时间",

        [d objectForKey:@"SLWCSJ"],@"受理完成时间",

        [d objectForKey:@"SLR"],@"受理人",

        [d objectForKey:@"ZJHM"],@"主叫号码",

        [d objectForKey:@"LXR"],@"联系人",

        [d objectForKey:@"LXDH"],@"联系电话",

        [d objectForKey:@"BXDZ"],@"报修地址",

        [d objectForKey:@"CLLX"],@"故障类型",

        [d objectForKey:@"JRLX"],@"接入类型",

        [d objectForKey:@"CLQY"],@"处理区域",

        [d objectForKey:@"FWJB"],@"服务级别",

        [d objectForKey:@"JJCD"],@"紧急程度",

        [d objectForKey:@"YXFW"],@"影响范围",

        [d objectForKey:@"QKMS"],@"受理情况",

        nil];

但是后来发现items2中始终只有一个对象“工作单编号“,检查后发现,其中“来电时间”对象是空,而dictionaryWithObjectsAndKeys方法在遇到nil对象时,会以为是最终的结束标志。于是items中只放了一个对象就初始化结束了,而且不管编译和运行中都不会报错,这样的bug显然很隐蔽。

 

           

给我老师的人工智能教程打call!http://blog.youkuaiyun.com/jiangjunshow
这里写图片描述
<think>好的,我现在需要帮用户解决如何使用NS(可能是命名空间或特定框架/库)重写代码的问题。用户提到了参考站内的引用[1]、[2]、[3],但根据上下文,用户之前的问题是关于Objective-C的代码优化,特别是使用字面量语法和NSValue等。因此,我需要结合这些引用内容来回答。 首先,用户提到“使用NS重写一段代码”,这里的NS可能指的是Objective-C中的Foundation框架中的类,比如NSArray、NSDictionary等,通常以NS为前缀。引用[1]讨论了使用字面量语法创建这些对象的好处,比如@[]、@{}等,所以可能需要用这些语法来重写代码示例。 用户提供的示例可能是一个使用传统方法创建数组或字典的代码,现在需要改用字面量语法。例如,原代码可能是用arrayWithObjects:方法创建数组,而改用@[...]会更简洁安全。 需要检查用户提供的示例代码是否存在问题,比如是否存在nil值导致数据截断的情况。引用[1]指出使用字面量语法在遇到nil时会抛出异常,而传统方法会丢失nil后的数据,这有助于提前发现问题。 另外,引用[2]提到NSValue的用途,但用户的问题可能不直接相关,除非示例中涉及到结构体的存储。但用户的问题集中在重写代码,可能主要涉及集合类的字面量语法。 接下来,我需要确认用户的具体示例代码是什么,但用户可能没有提供,所以可能需要假设一个常见的情况。比如,原代码可能使用[NSArray arrayWithObjects:obj1, obj2, nil],改用@[obj1, obj2]。 同时,需要注意字面量语法创建的不可变对象,如果需要可变,必须进行mutableCopy,如引用[1]所述。因此,在重写代码时,若需要可变数组,应添加mutableCopy。 此外,引用[3]关于URL重写可能与当前问题关联不大,但用户可能希望展示如何用NS相关类处理路由,但根据用户的问题,重点应放在集合类的字面量语法上。 最后,生成相关问题时要围绕字面量语法、NSValue的使用、不可变对象的处理等,确保覆盖用户可能的疑问。</think>根据引用[1]中关于Objective-C字面量语法的建议,我将展示如何用NS前缀的Foundation类进行代码重写优化。以下通过对比演示两种实现方式: ### 传统写法 vs NS字面量语法写法 ```objective-c // 传统方法(存在nil值隐患) NSArray *oldArray = [NSArray arrayWithObjects:@"iPhone", [NSNull null], @"Android", nil]; NSDictionary *oldDict = [NSDictionary dictionaryWithObjectsAndKeys: @"value1", @"key1", @(YES), @"key2", nil]; // NS字面量语法(引用[1]推荐方案) NSArray *newArray = @[ @"iPhone", [NSNull null], @"Android" ]; // 显式空值处理 NSDictionary *newDict = @{ @"key1" : @"value1", @"key2" : @YES // 自动装箱基本类型 }; // 结构体存储示例(引用[2] NSValue应用) CGPoint point = CGPointMake(10, 20); NSValue *pointValue = [NSValue valueWithCGPoint:point]; // 替代malloc+memcpy NSArray *shapePoints = @[ pointValue, @(CGPointZero) ]; // 混合存储 ``` ### 关键优化点说明 1. **安全性提升**(引用[1]特性): ```objective-c // 当元素包含nil时会立即崩溃(开发阶段暴露问题) NSArray *crashArray = @[ obj1, nil, obj3 ]; // 优于静默截断的传统写法 ``` 2. **类型自动转换**: ```objective-c // 自动处理基本类型装箱(等效NSNumber初始化) NSNumber *boolNum = @YES; // 替换 [NSNumber numberWithBool:YES] NSNumber *floatNum = @(3.14f); // 替换 [NSNumber numberWithFloat:3.14f] ``` 3. **可变对象处理**(引用[1]注意事项): ```objective-c NSMutableArray *mutableArr = [@[ @"a", @"b" ] mutableCopy]; // 必须显式转换 [mutableArr addObject:@"c"]; ``` ### 进阶应用示例 ```objective-c // 嵌套数据结构(自动类型推导) NSDictionary *config = @{ @"urls" : @[ @{ @"name" : @"home", @"path" : @"/index.php" }, @{ @"name" : @"about", @"path" : @"/about.html" } ], @"timeout" : @(30) }; // 结构体参数传递(引用[2] NSValue应用) NSValue *rectValue = [NSValue valueWithCGRect:CGRectMake(0,0,100,100)]; [view setPosition:rectValue]; ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值