對setObject:forKey:與setObject:forKeyedSubscript:的理解

godiscoder發表於2019-03-01

setObject:forKey:

宣告

- (void)setObject:(ObjectType)anObject forKey:(id<NSCopying>)aKey;
複製程式碼

引數

  • anObject

anObjectaKey的值,dictionary強引用該物件。如果anObject是nil,會引發NSInvalidArgumentException的異常,如果你想傳一個空值在dictionary中,可以使用NSNull代表空值

使用NSNull代表空值

NSNull *nilValue = [NSNull null];
NSMutableDictionary *dict = [[NSMutableDictionary alloc] init];
[dict setObject:nilValue forKey:@"nilvalue"];
複製程式碼
  • aKey aKey,會引發NSInvalidArgumentException的異常

setObject:forKeyedSubscript:

宣告

- (void)setObject:(ObjectType)obj forKeyedSubscript:(id<NSCopying>)key;
複製程式碼

引數

  • object

objectaKey的值,dictionary強引用該物件。如果object為nil,dictionary會將aKey的關聯的object移除

object為nil,dictionary會將aKey的關聯的object移除

NSMutableDictionary *dict = [[NSMutableDictionary alloc] init];
dict[@"name"] = @"jack"; //@{@"name":@"jack"}
dict[@"name"] = nil;     //@{}
複製程式碼
  • aKey aKey,會引發NSInvalidArgumentException的異常

說明

該方法和setObject:forKey:方法實現同樣的功能。你不需要直接代用該方法。當你使用下標賦值的時候,會呼叫該方法。

id value = @"someValue";
mutableDictionary[@"someKey"] = value; //等效於[mutableDictionary setObject:value forKeyedSubscript:@"someKey"];
複製程式碼

總結

  • 當呼叫setObject:forKey:傳入nil的時候會崩潰,使用setObject:forKeyedSubscript:則不會
  • 如果呼叫setObject:forKey:需要傳遞空值,可以使用NSNull
  • 使用下標賦值等效於呼叫setObject:forKeyedSubscript:方法

相關文章