和财产和方法声明前面的 - 和+标志让我很困惑。如果我以这种方式声明方法会有区别吗:
- (void)methodName:(id)sender {}
这样
+ (void)methodName:(id)sender {}
我真的不明白。
答案 0 :(得分:6)
'+'方法是一种类方法,可以直接在元类上调用。因此它无法访问实例变量。
' - '方法是一种实例方法,可以完全访问类的相关实例。
E.g。
@interface SomeClass
+ (void)classMethod;
- (void)instanceMethod;
@property (nonatomic, assign) int someProperty;
@end
您随后可以执行:
[SomeClass classMethod]; // called directly on the metaclass
或者:
SomeClass *someInstance = etc;
[someInstance instanceMethod]; // called on an instance of the class
请注意:
+ (void)classMethod
{
NSLog(@"%d", self.someProperty); // this is impossible; someProperty belongs to
// instances of the class and this is a class
// method
}
答案 1 :(得分:1)
为了体现@Tommy的答案,( - )方法将使用'self'变量,该变量是该方法将要处理的类实例。 (+)方法不会有。
例如,如果您有一个类FooBar并且想要比较2个实例,则可以执行以下任一操作:
+ (BOOL) compare:(FooBar)fb1 and:(FooBar)fb2 {
// compare fb1 and fb2
// return YES or NO
}
或
- (BOOL) compare:(FooBar)fb2
// compare self and fb2
// return YES or NO
}
第二个例程有'self'变量,类似于第一个例程中的fb1。 (这些惯例是人为的,但我希望你能得到这样的结论。)
答案 2 :(得分:1)
- (void)methodName:(id)sender {}
是一个实例方法,意味着您创建了一个类的实例,并且可以在该对象上调用该方法,或者以Objective-C的说法,向对象选择器发送消息。
+ (void)methodName:(id)sender {}
是一个类方法,这意味着它是在类本身上调用的静态方法,而不首先实例化对象。
在以下示例中,alloc
和stringWithString
是类方法,您可以直接在NSString
类上调用,不需要任何对象。另一方面,initWithString
是一个实例方法,您可以调用[NSString alloc]
返回的对象。
NSString* test = [[NSString alloc] initWithString:@"test"];
NSString* test2 = [NSString stringWithString:@"test2"];