Answers:
+
用于类方法和-
实例方法。
例如
// 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".
@classmethod
和@method
左右了。为什么那么简洁……?
(+)代表类别方法,(-)代表实例方法,
(+)类方法:
是声明为静态的方法。可以在不创建类实例的情况下调用该方法。类方法只能对类成员操作,而不能对实例成员操作,因为类方法不知道实例成员。除非在类的实例方法上调用它们,否则也不能从类方法内调用该类的实例方法。
(-)实例方法:-
另一方面,需要先存在该类的实例,然后才能调用它们,因此需要使用new关键字创建一个类的实例。实例方法在类的特定实例上运行。实例方法未声明为静态。
如何创建?
@interface CustomClass : NSObject
+ (void)classMethod;
- (void)instanceMethod;
@end
如何使用?
[CustomClass classMethod];
CustomClass *classObject = [[CustomClass alloc] init];
[classObject instanceMethod];
+方法是类方法-即无法访问实例属性的方法。用于不需要访问实例变量的类的alloc或helper方法之类的方法
-方法是实例方法-与对象的单个实例有关。通常用于类中的大多数方法。
有关更多详细信息,请参见语言规范。
self
,而是类。它们根本不与实例关联,并且方法查找不是通过实例,而是通过类。不过,您仍然可以这样做+exchangeIVarOf: (MYObject*)a with: (MYObject*)b { MYObject* x = a->ivar; a->ivar = b->ivar; b->ivar = x; }
Apple对此的明确解释位于“方法和消息传递”部分下:
简单来说:
(可以在不实例化类实例的情况下调用该方法)。所以你这样称呼它:
[className classMethod];
您需要先实例化一个对象,然后可以在该对象上调用方法。您可以像这样手动实例化一个对象:
SomeClass* myInstance = [[SomeClass alloc] init];
(这本质上是为对象分配内存空间,然后在该空间中初始化对象-一种过分简化但却是思考它的好方法。您可以单独分配和初始化对象,但永远不要这样做 -可能导致与指针相关的棘手问题和内存管理)
然后调用实例方法:
[myInstance instanceMethod]
在Objective C中获取对象实例的另一种方法是这样的:
NSNumber *myNumber = [NSNumber numberWithInt:123];
这将调用NSNumber类的“ numberWithInt” 类方法,该方法是“工厂”方法(即为您提供对象的“现成实例”的方法)。
目标C还允许直接使用特殊语法创建某些对象实例,例如在这样的字符串的情况下:
NSString * myStringInstance = @“ abc”;