setObject:forKey,setValue:forKey,setValue:forKeyPath的区别和用法

首先看一下setObject:forKey: 、 setValue:forKey: 、 setValue:forKeyPath: 的标准调用语句:

[muDict setValue:<#(nullableid)#> forKey:<#(nonnull NSString *)#>];

[muDict setValue:<#(nullableid)#> forKeyPath:<#(nonnull NSString *)#>];

[muDict setObject:<#(nonnullid)#> forKey:<#(nonnullid)#>];

明显可以看出:

(1) setValue:forKey: 的value是可以为nil的(但是当value为nil的时候,会自动调用removeObject:forKey方法);

setObject:forKey: 的value则不可以为nil。

(2) setValue:forKey: 的key必须是不为nil的字符串类型;

setObject:forKey: 的key可以是不为nil的所有类型。

一般使用时需要注意,setValue:forKey 会调用 setObejct:forKey: ,但有一个例外就是当 setObejct:forKey: 的value为nil的时候,会去调用 removeObjectForKey: ,也就是说会删除该key对应的value.

setObejct:forKey的key只要不是nil就行,存储在dict里的只是对象的引用。

setValue:forKey的key必须是string,dict会复制整个value保存起来。

objectForKey: 和 valueForKey: 在多数情况下都是一样的结果返回,但是如果 key 是以 @ 开头,valueForKey: 就成了一个大坑,建议在 NSDictionary 下只用 objectForKey: 来取值。

setValue:forKey: 与 setValue:forKeyPath的区别

动态设置: setValue:属性值 forKey:属性名(用于简单路径)、setValue:属性值 forKeyPath:属性路径(用于复合路径,例如Person有一个Account类型的属性,那么person.account就是一个复合属性)

动态读取: valueForKey:属性名 、valueForKeyPath:属性名(用于复合路径)


以下是具体代码实现与对比:

(1) setObject:和setValue:对比

NSMutableDictionary *dict   = [NSMutableDictionary dictionaryWithDictionary:@{@"cs":@"test"}];

NSDictionary *testDict      = @{@"name":@"test_name",@"age":@"12",@"dict":dict};

NSMutableDictionary *muDict = [NSMutableDictionary dictionaryWithDictionary:testDict];

[muDict setObject:@"object"forKey:@"key"];

[muDict setValue:@"value"forKey:@"key2"];

此时打印结果:

{

age =12;

dict =     {

cs = test;

};

key =object;

key2 = value;

name ="test_name";

}

这里setObject:forKey:与setValue:forKey:的作用是相同的,先检测muDict中是否存在key对应的键值对,存在就直接替换原有的value,否者就插入一条新键值对。

(2)forKeyPath:的使用

[muDict setValue:@"ceshi"forKeyPath:@"dict.cs"];

NSLog(@"%@", muDict);

此时打印结果:

{

age =12;

dict =     {

cs = ceshi;

};

key =object;

key2 = value;

name ="test_name";

}

这里是对muDict进行操作,处理复合路径dict.cs,首先检测muDict中是否存在dict对应的键值对,存在就去检测dict中是否有cs对应的键值对,有则替换value,没有创建键值对,如果muDict中检测不到dict的存在,那么就停止操作。

文章参考:setObject:forKey:与setValue:forKey:的区别

你可能感兴趣的:(setObject:forKey,setValue:forKey,setValue:forKeyPath的区别和用法)