SetValue:forKey和SetObject:forKey的区别

来源:互联网 发布:麻将软件 编辑:程序博客网 时间:2024/05/18 22:47

一、NSUserDefauts中2者区别

SetObject:forKey用于将键值对存到NSDefaults中,而SetValue:forKey本质是KVC,但是使用该方法也可以将指定键值对存入NSDefaults中。因此NSDefault应该复写了该方法。如果SetValue:forKey的key不是NSUserDefaults属性,那么作用和SetObject:forKey相同;如果key是NSDefaults属性,猜测作用应该是修改属性值。(http://stackoverflow.com/questions/26200066/nsuserdefaults-setvalue-and-objectforkey)。


试验如下:

-(void)defaultsTest

{

    NSUserDefaults* defualts = [NSUserDefaultsstandardUserDefaults];

    NSLog(@"original--->%@",defualts.volatileDomainNames);

    

    //使用setValue存入

    [defualts setValue:@"test"forKey:@"TEST"];

    NSLog(@"test--->%@",[defualtsvalueForKey:@"TEST"]);

    

    //key是属性名

    [defualts setValue:@[@"a",@"b"]forKey:@"volatileDomainNames"];

    NSLog(@"modified info1--->%@",[defualtsvalueForKey:@"volatileDomainNames"]);

    NSLog(@"modified info2--->%@",defualts.volatileDomainNames);

}


打印结果:

2016-01-07 11:49:38.233 NSDefaultsTest[1097:48401] original--->(

    NSRegistrationDomain,

    NSArgumentDomain

)

2016-01-07 11:49:38.236 NSDefaultsTest[1097:48401] test--->test

2016-01-07 11:49:38.236 NSDefaultsTest[1097:48401] modified info1--->(

    a,

    b

)

2016-01-07 11:49:38.236 NSDefaultsTest[1097:48401] modified info2--->(

    NSRegistrationDomain,

    NSArgumentDomain

)


通过上面打印结果可以看出

1.setValue:forKey的作用和setObject:forKey一样,可以用来存值。

2.setValue:forKey并不会触发KVC的作用从而改变NSUserDefaults的属性。而是会创建一个键和属性名相同的键值对,然后存到NSUserDefaults中。

总结:虽然实验结论是2者存值时,作用基本相同,但是不建议使用setValue:forKey来存值,而是使用正规方法:setObject:forKey


二、NSMutableDictionary

在NSMutableDictionary中二者功能也基本相同

-(void)dictionaryTest

{

    NSMutableDictionary* dic = [NSMutableDictionarydictionary];

    

    [dic setObject:@"test"forKey:@"TEST"];

    [dic setValue:@"test2"forKey:@"TEST2"];

    NSLog(@"description--->%@",dic);

}

打印结果:

2016-01-07 14:07:56.914 NSDefaultsTest[1148:61587] description--->{

    TEST = test;

}

2016-01-07 14:07:56.915 NSDefaultsTest[1148:61587] description--->{

    TEST = test;

    TEST2 = test2;

}

当然还是有区别的

1. 在NSMutableDictionary的setValue: forKey:的定义中

/* Send -setObject:forKey: to the receiver, unless the value is nil, in which case send -removeObject:forKey:.

*/

- (void)setValue:(id)value forKey:(NSString *)key;

@end

上面注释说的很清楚,发送setObject:forKey 给接收者,也就是调用setObject:forKey方法

除非value为nil的时候,调用方法removeObject:forKey


2.setObject:forKey:定义:

@interface NSMutableDictionary<KeyType, ObjectType> :NSDictionary<KeyType, ObjectType>

- (void)removeObjectForKey:(KeyType)aKey;

- (void)setObject:(ObjectType)anObject forKey:(KeyType <NSCopying>)aKey;

因此key可以是任何类型,而setValue中的key只能是String

总结:

1.setObject:forkey:中value是不能够为nil的,不然会报错。

setValue:forKey:中value能够为nil,但是当value为nil的时候,会自动调用removeObject:forKey方法

2.setValue:forKey:中key的参数只能够是NSString类型,而setObject:forKey:的可以是任何类型





0 0