【问题标题】:Class versus Instance method Obejctive-C calls - NSLocale methods类与实例方法 Obejctive-C 调用 - NSLocale 方法
【发布时间】:2012-06-03 07:01:48
【问题描述】:

无论如何,我是一个非常绿色的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]。上面已经创建了“这里”的实例。谁能解释一下。

【问题讨论】:

  • 虽然您的问题以 NSLocale 为例,但它实际上是关于实例与类方法的。您可能需要考虑更改问题的标题,以使其对可能访问Stack Overflow 并遇到与您相同的问题的其他人有用。

标签: method-call nslocale


【解决方案1】:

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

+ preferredLanguages:

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

这是来自Apple's "Learning Objective C" document的相关段落

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

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

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

【讨论】:

  • 谢谢,在重读了关于调用类与实例方法的那部分之后,我完全理解了。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-08-30
相关资源
最近更新 更多