和财产和方法声明前面的 - 和+号混淆了我很多。是否有区别,如果我宣布的方法是这样的:定义方法属性时,+和 - 有什么区别?
- (void)methodName:(id)sender {}
和这样
+ (void)methodName:(id)sender {}
我真的不明白这一点。
和财产和方法声明前面的 - 和+号混淆了我很多。是否有区别,如果我宣布的方法是这样的:定义方法属性时,+和 - 有什么区别?
- (void)methodName:(id)sender {}
和这样
+ (void)methodName:(id)sender {}
我真的不明白这一点。
'+'方法是一个类方法,可以直接在元类上调用。因此它无法访问实例变量。
' - '方法是一个实例方法,可以完全访问类的相关实例。
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
}
因此,如果我理解得当,可以在某种程度上将它与调用静态方法进行比较。他们不必被实例化。如果他们不能访问外部变量,那么使用它们的目的是什么?请问您能解释一下吗?非常感谢您的快速回复。 –
@No One在特定的答案解释了他们的用途。再次感谢。 –
我不认为这是metaclass的正确用法.http://www.sealiesoftware.com/blog/archive/2009/04/14/objc_explain_Classes_and_metaclasses.html –
要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类似。 (这些程序是做作,但我希望你得到的图片。)
类方法也有一个隐藏的'self'参数,但它指向类对象而不是实例。 –
此外,围绕'+'和'-'的括号应该围绕返回类型。 – 2011-09-10 02:02:59
@Bavarious - 感谢您的纠正。已编辑。 (我把它放在飞行中。) –
- (void)methodName:(id)sender {}
是一个实例方法,这意味着你创建一个类的实例,并且可以调用方法的对象上,或者在目标-C的说法,发送消息给对象选择器。
+ (void)methodName:(id)sender {}
是一个类的方法,这意味着它是你调用类本身,而无需首先实例化对象的静态方法。
在以下示例中,alloc
和stringWithString
是类方法,可直接在NSString
类上调用,不需要任何对象。另一方面,initWithString
是一个实例方法,您可以调用[NSString alloc]
返回的对象。
NSString* test = [[NSString alloc] initWithString:@"test"];
NSString* test2 = [NSString stringWithString:@"test2"];
没有违法,但它听起来像你需要阅读底漆。从这里开始:http://developer.apple.com/library/mac/#referencelibrary/GettingStarted/Learning_Objective-C_A_Primer/_index。html –
我知道C和Java等其他语言,所以我认为我不需要,因为它可能没有那么大的不同。我真的应该tho。谢谢 –