iOS setObject与setValue的区别详解

在我们平时的编程经历中用了许多的setObject:forKey: 与setValue: forKey。平时用的时候一般不会注意这两个方法有什么区别,有什么共同点,下边来look look。

1.在Xcode中cmd点进去看官方定义,可以发现,两个方法还是有联系和细微区别的,

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

      可以发现setObject:是set了一个对象类型的数据。

  • @interface NSMutableDictionary(NSKeyValueCoding)

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

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

      setValue相当于扩展了一个NSMUtableDictionary的一个类别,注释的意思是发送setObject给接收者,调用的也是setObject:forkey方法。但是当这个value为nil的时候,则自动调用removeObject:forkey

2.再说说他们的区别

  • setObject是NSMutableDictionary独有的方法,setValue则是KVC的主要方法。并且setValue的调用对象可以是任何类,以此来处理自身的属性。
  • 如果setObject:nil,这样会会直接crash崩溃;但是setvalue的时候,如果为nil,系统会自动调用removeObject:forKey方法,就没这个问题了,但是不好检测。

PS:如果setObject:[NSNull null] forKey。这样是没问题的,因为[NSNull null]是一个对象

       setValue只能set一个NSString类型的数据,但是setObject却可以是任何类型


你可能感兴趣的:(浅析iOS)