setObject:forKey:与setValue:forKey:的区别

首先不可变字典可以调起setValue:forKey:,但不能真正的进行操作,这取决与不可变字典不可增删改的特性。

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

[muDict setValue:<#(nullable id)#> forKey:<#(nonnull NSString *)#>];
[muDict setValue:<#(nullable id)#> forKeyPath:<#(nonnull NSString *)#>];
[muDict setObject:<#(nonnull id)#> forKey:<#(nonnull id<NSCopying>)#>];

明显可以看出:
(1) setValue:forKey: 的value是可以为nil的(但是当value为nil的时候,会自动调用removeObject:forKey方法);
    setObject:forKey: 的value则不可以为nil。
(2) setValue:forKey: 的key必须是不为nil的字符串类型;

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

//Demo:
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,否者就插入一条新键值对。

[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的存在,那么就停止操作。

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

时间: 2024-08-24 21:25:15

setObject:forKey:与setValue:forKey:的区别的相关文章

Objective-c setObject:forKey:和setValue:forKey:的区别

setObject:forKey: 是NSMutableDictionary类的方法 key参数类型可以是任意类型对象 value不能为nil,不然会报错 setValue:forKey: 是NSObject类的方法也就是说所有的OC对象都有这个方法 key值必须是字符串 value可以为nil,但是当value为空时,会自动调用removeObject:forKey方法 1.注意:setObject:forKey:对象不能存放nil要与下面的这种情况区分: [imageDictionaryse

setObject:forKey和setValue:forKey的区别

setObject:forKey: 是NSMutableDictionary类的方法                              key参数类型可以是任意类型对象                              value不能为nil,不然会报错 setValue:forKey: 是NSObject类的方法也就是说所有的OC对象都有这个方法                            key值必须是字符串                            v

setValue: forKey: 和 setValue: forKeyPath:

一. 先说下setObject forKey 和 setValue forKey 1.setObject:ForKey: 是NSMutableDictionary特有的:setValue:ForKey:是KVC的主要方法:2.setObject:ForKey:中object对象不能为nil,不然会报错:key的参数只要是对象就可以,并局限于 NSString:                                                                     

setValue:forKey:和setObject:forKey:调用者是dictionary时的区别

通常使用NSMutableDictionary时经常会使用setValue:forKey:和setObject:forKey:他们一般情况下是可以交互使用的,但是他们在特定情况下是有区别的: 官方文档中有如下注释: /* Send -setObject:forKey: to the receiver, unless the value is nil, in which case send -removeObjectForKey:. */ - (void)setValue:(nullable Ob

setValue:forKey:和 setObjectforKey: 区别

1 setValue: forKey:的定义 @interface NSMutableDictionary(NSKeyValueCoding)/* Send -setObject:forKey: to the receiver, unless the value is nil, in which case send -removeObject:forKey:.*/- (void)setValue:(id)value forKey:(NSString *)key;@endvalue 为 nil ,

iOS.KVC.setValue:forKey:

Foundation Framework 定义了 NSObject(NSKeyValueCoding), - (void)setValue:(id)value forKey:(NSString *)key; 该接口的说明 1. 先在message receiver的class中搜索方法 -set<Key>: 2. 如果1中未找到,则在class中以此搜索 _<key>, _is<key>, <key>, is<Key> 实例变量 3. 如果2中未

IOS setValue forKey

NSObjiect *obj:[obj setValue:value forKey:@"cpname"]复制代码的时候都会出现这个异常this class is not key value coding-compliant for the key cpname; 原因:obj不包含属性cpname 可以考虑使用 NSMutaleDictionary(Mutable) 类型的变量保存

iOS面试题系列之Objective-C相关

1.简述你项目中常用的设计模式.它们有什么优缺点? 常用的设计模式有:代理.观察者.单例. (1)单例:它是用来限制一个类只能创建一个对象.这个对象中的属性可以存储全局共享的数据.所有的类都能访问.设置此单例中的属性数据. 优点:是它只会创建一个对象容易供外界访问,节约性能. 缺点:是一个类只有一个对象,可能造成责任过重,在一定程度上违背了"单一职责原则".单例模式中没有抽象层,所以单例类的扩展有很大的困难.不能过多创建单例,因为单例从创建到程序关闭前会一直存在,过多的单例会影响性能,

OC_ NSDictionary ,NSMutableDictionary 字典

1 数组与字典的区别 数组: 1>存放一组有序对象的集合 2> 通过index下标找对应的对象 3> 数组中对象可以重复 字典: 1>存放一组无序key-value的集合 2> 通过key找到对应的value 3>字典key是唯一的,但是不同的value可以重复 2 字典的初始化 使用一个类方法创建一个空字典(常用) NSDictionary *dic1 = [NSDictionary dictionary]; (常用) 通过字面量去创建不可变数组和不可变字典 NSAr