1

无论如何,我是一个非常绿色的 nubie,我正在完成一个教程,该教程将引导我使用 NSLocale 类来获取当地货币,如下所示:

NSLocale *here = [NSLocale currentLocale];
NSString *currency = [here objectForKey:NSLocaleCountryCode];
NSLog(@"Money is %@", currency);

所以,我知道我正在创建一个名为“here”的 NSLocale 类的实例,然后我向“here”对象发送一条消息,询问 objectForKey,并将结果返回到名为“currency”的 NSString 中。最后,我使用 NSLog 打印货币值。

好的,这是我的问题,然后我查看了 NSLocale 类上还有哪些其他方法,我发现了一个名为“preferredLanguages”的方法,它返回了一组首选语言。所以我虽然我会调用该方法,然后将其打印到日志中,只是为了微笑和帮助我学习。离开上面的例子,我想我会这样称呼它。从上面的代码中我已经有一个名为“here”的 NSLocale 类的实例开始,我认为我只需要以下内容(我重复上面的三行只是为了便于在这里阅读。)

NSLocale *here = [NSLocale currentLocale];
NSString *currency = [here objectForKey:NSLocaleCountryCode];
NSLog(@"Money is %@", currency);

NSArray *prefLangs = [here preferredLanguages];
NSLog(@"Preferred Languages are: %@", prefLangs);

但这不起作用,我收到一条错误消息,上面写着“'NSLocale' 没有可见的@interface 声明选择器'preferredLanguages'

我发现我必须这样做:

NSLocale *here = [NSLocale currentLocale];
NSString *currency = [here objectForKey:NSLocaleCountryCode];
NSLog(@"Money is %@", currency);

NSArray *prefLangs = [NSLocale preferredLanguages];
NSLog(@"Preferred Languages are: %@", prefLangs);

我只是不明白为什么我必须调用这样的方法:[NSLocale preferredLanguages],而不是[这里的preferredLanguages]。上面已经创建了“这里”的实例。有人可以解释一下。

4

1 回答 1

1

你很快就会习惯于 Objective C 的快乐和痛苦,但简短的回答包括查看方法声明,它看起来像:

+ preferredLanguages:

声明中的“+”表示它是一个类方法。

这是Apple 的“学习目标 C”文档中的相关段落

Objective-C 中的一个类可以声明两种类型的方法:实例方法和类方法。实例方法是一种方法,其执行范围仅限于类的特定实例。也就是说,在调用实例方法之前,必须先创建类的实例。相比之下,类方法不需要您创建实例,但稍后会详细介绍。

如果声明以“-”开头,则使其成为实例方法,并且您需要实例化(创建)实例才能调用该对象上的方法。

希望到目前为止这是有道理的。

于 2012-05-29T03:40:19.903 回答