在定义方法的属性时,+和 - 之间有什么区别?

时间:2011-09-09 22:18:14

标签: objective-c ios macos cocoa

和财产和方法声明前面的 - 和+标志让我很困惑。如果我以这种方式声明方法会有区别吗:

- (void)methodName:(id)sender {}

这样

+ (void)methodName:(id)sender {}

我真的不明白。

3 个答案:

答案 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 {}

是一个类方法,这意味着它是在类本身上调用的静态方法,而不首先实例化对象。

在以下示例中,allocstringWithString是类方法,您可以直接在NSString类上调用,不需要任何对象。另一方面,initWithString是一个实例方法,您可以调用[NSString alloc]返回的对象。

NSString* test = [[NSString alloc] initWithString:@"test"];

NSString* test2 = [NSString stringWithString:@"test2"];