Objective c 为什么objC中没有*分叉路径?

Objective c 为什么objC中没有*分叉路径?,objective-c,nsdictionary,Objective C,Nsdictionary,为什么会有valueForKey:和intForKey:,stringForKey:,等等 但是有valueForKeyPath:并且没有intForKeyPath:、stringForKeyPath:,等等?Apple的NSDictionary不支持名为intForKey:或stringForKey:的消息 也许您正在使用某个第三方库将这些消息添加到一个类别中。您可以询问该库的作者为什么不包含消息的keypath版本 也许您考虑的是nsserdefaults,而不是NSDictionaryNS

为什么会有valueForKey:和intForKey:,stringForKey:,等等


但是有valueForKeyPath:并且没有intForKeyPath:、stringForKeyPath:,等等?

Apple的
NSDictionary
不支持名为
intForKey:
stringForKey:
的消息

也许您正在使用某个第三方库将这些消息添加到一个类别中。您可以询问该库的作者为什么不包含消息的keypath版本


也许您考虑的是
nsserdefaults
,而不是
NSDictionary
NSUserDefaults
理解
IntegerWorkey:
stringForKey:
<代码>NSUserDefaults不用于存储大型复杂结构。它用于存储小而简单的数据。

您混合了来自两个不同对象(实际上是一个对象和一个非正式协议)的方法名称:
NSUserDefaults
和非正式协议

NSUserDefaults
已存在多年,而键值编码和键值观察仅在OS X 10.3之后才出现

NSUserDefaults
处理存储与属性列表兼容的对象(NSData、NSDate、NSString、NSArray和NSDictionary),以便在应用程序启动之间持久化。应用程序通常需要存储bool或int等非对象类型的值,但只支持对象,因此这些方便的方法(
intForKey:
boolforky:
等)允许以更简洁的方式保存它们。例如,下面的代码行

[[NSUserDefaults standardUserDefaults] setObject:[NSNumber numberWithBool:NO] forKey:MDFirstLaunchKey];
变成:

[[NSUserDefaults standardUserDefaults] setBool:NO forKey:MDFirstLaunchKey];
相应的“get”方法允许更简洁的代码来获取非对象类型的值

NSUserDefaults
中这些方法的另一个目的是验证对象类型。假设您在键
MDClientsKey
下保存了
NSDictionary
s的
NSArray
,并且您错误地编写了以下代码:

NSDictionary *client = [userDefaults objectForKey:MDClientsKey];
NSString *name = [client objectForKey:@"name"];
Objective-C的动态特性意味着对象用户默认返回的
objectForKey:
调用将不是代码假定的
NSDictionary
,而是
NSArray
。下一行将尝试在NSArray上调用
objectForKey:
,这可能会引发NSInvalidArgumentException并导致应用程序崩溃

如果改为使用,
NSUserDefaults
将返回
nil

NSDictionary *client = [userDefaults dictionaryForKey:MDClientsKey];
NSString *name = [client objectForKey:@"name"];
随后的一行表示您正在向
nil
发送一条消息,该消息被忽略(换句话说,没有崩溃)


另一方面,
valueForKey:
valueForKeyPath:
方法是
NSKeyValueCoding
非正式协议的一部分。它们基本上允许一个对象使用
NSString
按名称访问另一个对象的实例变量,而不必调用方法。其中一个关键部分是
valueForKey:
valueForKeyPath:
需要返回对象,而不是
int
float
等基本类型。事实上,如果对象具有
height
属性,该属性是
NSInteger
等基本类型,则调用
[对象值forkeypath:@“height”]
是否需要返回一个
NSNumber
。因此,使用扩展的
*ForKeyPath:
访问器没有多大意义。

这是因为苹果希望程序员使用他们的技能。如果你愿意,你可以在其中添加一个类别