Objective-C中+和-方法之间的区别

38

使用 - 声明的方法和使用 + 声明的方法有什么区别?

例如:

- (void)methodname

+ (void)methodname
5个回答

57

- 前缀的方法是实例方法。这意味着它们只能在类的实例上调用,例如:

[myStringInstance length];

+前缀的方法是类方法。这意味着它们可以在类上调用,而不需要实例化,例如:

方法以-前缀开头是实例方法,必须通过类的实例来调用。

[NSString stringWithString:@"Hello World"];

1
只是好奇:为什么选择这种符号表示法?对我来说,+/-感觉有点破解(可能是因为它让我想起perl如何使用“@”、“#”、“$”表示某些东西)。 - Anthony Kong
2
抱歉,我无法对符号的选择进行评论,因为我并不了解...抱歉。也许其他人会知道? - Jasarien
2
UML使用+/-来确保。此外,UML使用+/-来注释方法。然而,除此之外,UML的使用和Obj-C的使用完全不同。 - deft_code
@FrançoisBeausoleil 我认为 UML 使用 +/- 符号来表示公共/私有属性或函数。(http://www.tutorialspoint.com/images/notation_class.jpg) - Mehdi Karamosly

7

+(void)methodname是类变量,-(void)methodname是对象变量。

假设你创建了一个实用类,其中有一个反转字符串的方法。你称之为MYUtility。

如果使用+,例如:


+ (NSString *)reverse:(NSString *)stringToReverse

您可以直接使用它,例如:
NSString *reversed = [MYUtility stringToReverse:@"I Love objective C"];

如果您使用了“-”,例如:
- (NSString *)reverse:(NSString *)stringToReverse

你需要使用:
MYUtility *myUtil = [[MYUtility alloc] init];
NSString *reversed = [myUtil stringToReverse:@"There are many ways to do the same thing"];

使用基于类的函数时,您可以直接调用,但是除了可以使用的#defines之外,您没有访问任何局部变量的权限,因为该类尚未实例化。
但是使用- (NSString)之前必须实例化该类才能使用,并且您可以访问所有局部变量。
这不是选择一个并保持不变的事情,许多类都有这两种功能,请查看NSString的标头文件,它充斥着+功能和-功能。

2

minus 是实例方法(只能通过实例化的对象访问)

plus 是类方法(就像Java中的Math.abs(),可以在没有实例化对象的情况下使用)


1
根据此页面所述:

实例方法以 - 开头,类级别方法以 + 开头

有关更多信息,请参见此SO问题

0
第一个是实例方法,第二个是类方法。您应该阅读苹果的Objective-C文档以了解它们之间的区别。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接