方法C旁边的加号和减号是什么意思?

gyu*_*isc 176 syntax objective-c method-declaration

我在目标c和xcode中都很新.我想知道方法定义旁边的符号+-符号是什么意思.

- (void)loadPluginsAtPath:(NSString*)pluginPath errors:(NSArray **)errors;
Run Code Online (Sandbox Code Playgroud)

Geo*_*lly 222

+用于类方法,-用于实例方法.

例如

// 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".
Run Code Online (Sandbox Code Playgroud)

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

  • 这几乎就像"静态"的额外五个字符对他们来说太过分了. (60认同)
  • @Anon:方法不是静态的.他们是阶级方法.它们可以被覆盖,并且是类层次结构的一部分.静态意味着C中的一些非常不同 (23认同)
  • @bbum是有钱的.事实上,Java重新使用"静态"关键字来表示不同的东西并不是更老的C的错.尽管它的使用在C中可能不完全直观,但在Java中似乎更不直观.我希望静态与动态相反 - 这是不会改变的.当然,在Apple X在OS X中采用Objective-C之前,Objective-C语言已经存在了将近15年. (13认同)
  • @Avon,那是你的苹果,他们也会在相机上留下一个闪光灯,并在他们的老鼠身上留下一个右键.=) (4认同)
  • static和class方法之间的区别:在MYBaseClass及其子类MYSubClass中定义方法+ foo.NSArray*classes = @ [[MYBaseClass class],[MYSubClass class]]; [classes makeObjectsPerformSelector:@selector(foo)]; 不适用于静态方法.那就是说,我更喜欢`@ classmethod`和`@ method`左右.为什么如此简洁......? (3认同)
  • 链接到文档:http://developer.apple.com/mac/library/DOCUMENTATION/Cocoa/Conceptual/ObjectiveC/Articles/ocDefiningClasses.html#//apple_ref/doc/uid/TP30001163-CH12-TPXREF122 (2认同)
  • @uliwitness当ObjC作为C编译器之上的预处理器实现时,简洁性可以追溯到初期.那时,使用`@ ...`标记除了引入类接口和实现之外是非常罕见的.当`@ ...'变得普遍时,`+`与`-`是根深蒂固的,我猜,从来没有考虑过为方法介绍添加同义句法形式. (2认同)

Van*_*hta 42

(+)用于类方法和( - )用于例如方法,

(+)类方法: -

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

( - )实例方法: -

另一方面,在调用类之前需要该类的实例存在,因此需要使用new关键字创建类的实例.实例方法对特定的类实例进行操作.实例方法未声明为静态.


Rob*_*tie 18

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

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

有关详细信息,请参阅语言规范.


Chr*_*row 5

苹果公司对此的明确解释是在"方法和消息"部分下面的:

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

简单来说:

+表示'类方法'

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

[className classMethod]; 
Run Code Online (Sandbox Code Playgroud)


- 表示'实例方法'

您需要首先实例化一个对象,然后您可以调用该对象上的方法).您可以手动实例化这样的对象:

SomeClass* myInstance = [[SomeClass alloc] init];
Run Code Online (Sandbox Code Playgroud)

(这实际上是为对象分配内存空间然后初始化该空间中的对象 - 过度简化但是考虑它的好方法.你可以单独分配和初始化对象但从不这样做 - 它可能导致与指针相关的讨厌问题和内存管理)

然后调用实例方法:

[myInstance instanceMethod]
Run Code Online (Sandbox Code Playgroud)

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

NSNumber *myNumber = [NSNumber numberWithInt:123];
Run Code Online (Sandbox Code Playgroud)

它调用NSNumber类的'numberWithInt' 类方法,这是一个'工厂'方法(即为您提供对象的'现成实例'的方法).

Objective C还允许使用特殊语法直接创建某些对象实例,就像这样的字符串一样:

NSString*myStringInstance = @"abc";