2011-09-09 45 views
1

和财产和方法声明前面的 - 和+号混淆了我很多。是否有区别,如果我宣布的方法是这样的:定义方法属性时,+和 - 有什么区别?

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

和这样

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

我真的不明白这一点。

+2

没有违法,但它听起来像你需要阅读底漆。从这里开始:http://developer.apple.com/library/mac/#referencelibrary/GettingStarted/Learning_Objective-C_A_Primer/_index。html –

+0

我知道C和Java等其他语言,所以我认为我不需要,因为它可能没有那么大的不同。我真的应该tho。谢谢 –

回答

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 
} 
+0

因此,如果我理解得当,可以在某种程度上将它与调用静态方法进行比较。他们不必被实例化。如果他们不能访问外部变量,那么使用它们的目的是什么?请问您能解释一下吗?非常感谢您的快速回复。 –

+0

@No One在特定的答案解释了他们的用途。再次感谢。 –

+1

我不认为这是metaclass的正确用法.http://www.sealiesoftware.com/blog/archive/2009/04/14/objc_explain_Classes_and_metaclasses.html –

1

要embelish上@汤米的答复,( - )方法将会使用'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 
} 

第二个例程具有“自我“变量,它与第一个例程中的fb1类似。 (这些程序是做作,但我希望你得到的图片。)

+3

类方法也有一个隐藏的'self'参数,但它指向类对象而不是实例。 –

+0

此外,围绕'+'和'-'的括号应该围绕返回类型。 – 2011-09-10 02:02:59

+0

@Bavarious - 感谢您的纠正。已编辑。 (我把它放在飞行中。) –

1

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

是一个实例方法,这意味着你创建一个类的实例,并且可以调用方法的对象上,或者在目标-C的说法,发送消息给对象选择器。

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

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

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

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

NSString* test2 = [NSString stringWithString:@"test2"]; 
相关问题