方法旁边的Objective-C中的正号和负号是什么意思?


179

在Objective-C中,我想知道方法定义旁边的+-符号的含义。

- (void)loadPluginsAtPath:(NSString*)pluginPath errors:(NSArray **)errors;

Answers:


225

+用于类方法和-实例方法。

例如

// Not actually Apple's code.
@interface NSArray : NSObject {
}
+ (NSArray *)array;
- (id)objectAtIndex:(NSUInteger)index;
@end

// somewhere else:

id myArray = [NSArray array];         // see how the message is sent to NSArray?
id obj = [myArray objectAtIndex:4];   // here the message is sent to myArray

// Btw, in production code one uses "NSArray *myArray" instead of only "id".

还有另一个问题涉及类方法和实例方法之间的区别


62
几乎好像多余的五个“静态”字符对他们来说太大了。
Anon。

23
@Anon:方法不是静态的。它们是类方法。它们可以被覆盖,并且在类层次结构中非常重要。静态意味着C.非常不同的东西
bbum

4
@Avon,这是给您的苹果,他们也会在相机上留下闪光灯,并在鼠标上留下右键。=)
pokstad,2010年

13
@bbum有钱。Java重新分配了“ static”关键字来表示不同的事实,这并不是很老的C的错。尽管C的用法可能并不完全直观,但Java似乎更是如此。我希望静态与动态相反-不会改变。当然,在Objective-C语言是各地的近15年之前,苹果在OS X中采用它
奎因泰勒

3
静态方法和类方法之间的区别:在MYBaseClass及其子类MYSubClass中定义方法+ foo。NSArray *类= @ [[MYBaseClass类],[MYSubClass类]]; [类makeObjectsPerformSelector:@selector(foo)]; 无法使用静态方法。这就是说,我would'a首选的@classmethod@method左右了。为什么那么简洁……?
uliwitness 2014年

44

(+)代表类别方法,(-)代表实例方法,

(+)类方法:

是声明为静态的方法。可以在不创建类实例的情况下调用该方法。类方法只能对类成员操作,而不能对实例成员操作,因为类方法不知道实例成员。除非在类的实例方法上调用它们,否则也不能从类方法内调用该类的实例方法。

(-)实例方法:-

另一方面,需要先存在该类的实例,然后才能调用它们,因此需要使用new关键字创建一个类的实例。实例方法在类的特定实例上运行。实例方法未声明为静态。

如何创建?

@interface CustomClass : NSObject

+ (void)classMethod;
- (void)instanceMethod;

@end

如何使用?

[CustomClass classMethod];

CustomClass *classObject = [[CustomClass alloc] init];
[classObject instanceMethod];

18

+方法是类方法-即无法访问实例属性的方法。用于不需要访问实例变量的类的alloc或helper方法之类的方法

-方法是实例方法-与对象的单个实例有关。通常用于类中的大多数方法。

有关更多详细信息,请参见语言规范


好吧,实际上类方法确实可以访问实例变量,它们只是没有实例as self,而是类。它们根本不与实例关联,并且方法查找不是通过实例,而是通过类。不过,您仍然可以这样做+exchangeIVarOf: (MYObject*)a with: (MYObject*)b { MYObject* x = a->ivar; a->ivar = b->ivar; b->ivar = x; }
uliwitness 2014年

5

Apple对此的明确解释位于“方法和消息传递”部分下:

https://developer.apple.com/library/mac/referencelibrary/GettingStarted/RoadMapOSX/books/WriteObjective-CCode/WriteObjective-CCode/WriteObjective-CCode.html

简单来说:

+表示“类方法”

(可以在不实例化类实例的情况下调用该方法)。所以你这样称呼它:

[className classMethod]; 


-表示“实例方法”

您需要先实例化一个对象,然后可以在该对象上调用方法。您可以像这样手动实例化一个对象:

SomeClass* myInstance = [[SomeClass alloc] init];

(这本质上是为对象分配内存空间,然后在该空间中初始化对象-一种过分简化但却是思考它的好方法。您可以单独分配和初始化对象,但永远不要这样做 -可能导致与指针相关的棘手问题和内存管理)

然后调用实例方法:

[myInstance instanceMethod]

在Objective C中获取对象实例的另一种方法是这样的:

NSNumber *myNumber = [NSNumber numberWithInt:123];

这将调用NSNumber类的“ numberWithInt” 类方法,该方法是“工厂”方法(即为您提供对象的“现成实例”的方法)。

目标C还允许直接使用特殊语法创建某些对象实例,例如在这样的字符串的情况下:

NSString * myStringInstance = @“ abc”;

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.