Objective c 定义方法的属性时,+和-之间有什么区别?
属性和方法声明前面的-和+符号让我很困惑。如果我这样声明方法,是否有区别:Objective c 定义方法的属性时,+和-之间有什么区别?,objective-c,ios,macos,cocoa,Objective C,Ios,Macos,Cocoa,属性和方法声明前面的-和+符号让我很困惑。如果我这样声明方法,是否有区别: - (void)methodName:(id)sender {} 这边 + (void)methodName:(id)sender {} 我真的不明白。一个“+”方法是一个类方法,可以直接在元类上调用。因此,它无法访问实例变量 “-”方法是一种实例方法,可以完全访问类的相关实例 例如 您随后可以执行以下操作: [SomeClass classMethod]; // called directly on the met
- (void)methodName:(id)sender {}
这边
+ (void)methodName:(id)sender {}
我真的不明白。一个“+”方法是一个类方法,可以直接在元类上调用。因此,它无法访问实例变量 “-”方法是一种实例方法,可以完全访问类的相关实例 例如 您随后可以执行以下操作:
[SomeClass classMethod]; // called directly on the metaclass
或:
请注意:
+ (void)classMethod
{
NSLog(@"%d", self.someProperty); // this is impossible; someProperty belongs to
// instances of the class and this is a class
// method
}
“+”方法是类方法,可以直接在元类上调用。因此,它无法访问实例变量 “-”方法是一种实例方法,可以完全访问类的相关实例 例如 您随后可以执行以下操作:
[SomeClass classMethod]; // called directly on the metaclass
或:
请注意:
+ (void)classMethod
{
NSLog(@"%d", self.someProperty); // this is impossible; someProperty belongs to
// instances of the class and this is a class
// method
}
为了润饰@Tommy的答案,-方法将使用一个“self”变量,该变量是该方法将处理的类实例。+方法不会有这个 例如,如果您有一个类FooBar,并且希望比较两个实例,则可以执行以下任一操作:
+ (BOOL) compare:(FooBar)fb1 and:(FooBar)fb2 {
// compare fb1 and fb2
// return YES or NO
}
或
第二个例程具有与第一个例程中的fb1类似的“self”变量。这些例程都是人为设计的,但我希望你能理解。为了对@Tommy的答案进行润饰,方法将使用一个“self”变量,该变量是该方法将处理的类实例。+方法不会有这个 例如,如果您有一个类FooBar,并且希望比较两个实例,则可以执行以下任一操作:
+ (BOOL) compare:(FooBar)fb1 and:(FooBar)fb2 {
// compare fb1 and fb2
// return YES or NO
}
或
第二个例程具有与第一个例程中的fb1类似的“self”变量。这些例程是人为设计的,但我希望您能理解。-voidmethodName:idsender{}
是实例方法,这意味着您创建了一个类的实例,并且可以对对象调用该方法,或者用Objective-C的说法,向对象选择器发送消息
+voidmethodName:idsender{}
是一个类方法,这意味着它是对类本身调用的静态方法,而无需首先实例化对象
在下面的示例中,alloc和stringWithString是类方法,您可以直接调用NSString类,而不需要对象。另一方面,initWithString是一个实例方法,您可以对[NSString alloc]返回的对象调用它
-voidmethodName:idsender{}
是实例方法,这意味着您创建了一个类的实例,并且可以对对象调用该方法,或者用Objective-C的说法,向对象选择器发送消息
+voidmethodName:idsender{}
是一个类方法,这意味着它是对类本身调用的静态方法,而无需首先实例化对象
在下面的示例中,alloc和stringWithString是类方法,您可以直接调用NSString类,而不需要对象。另一方面,initWithString是一个实例方法,您可以对[NSString alloc]返回的对象调用它
因此,如果我正确理解它,它可以在某种程度上与调用静态方法相比较。它们不必被实例化。如果他们无法访问外部变量,那么使用它们的目的是什么,请解释一下?非常感谢您的快速响应。@没有人能解释它们的用途。再次感谢。我认为这不是元类这个术语的正确用法。@Jon Hess:我认为你是对的;当我试图找到一种方法,从本质上说,类方法是实例方法,就像元类是类一样,这是非常不精确的。也就是说,如果将元类的定义编写为练习,则其实例方法将是它所描述的类上的类方法。在你看来,这是对问题的准确描述吗?如果是这样,我会适当地编辑我的评论;如果不是,那么您将如何编辑?因此,如果我正确理解它,它可以在某种程度上与调用静态方法相比较。它们不必被实例化。如果他们无法访问外部变量,那么使用它们的目的是什么,请解释一下?非常感谢您的快速响应。@没有人能解释它们的用途。再次感谢。我认为这不是元类这个术语的正确用法。@Jon Hess:我认为你是对的;当我试图找到一种方法,从本质上说,类方法是实例方法,就像元类是类一样,这是非常不精确的。也就是说,如果将元类的定义编写为练习,则其实例方法将是它所描述的类上的类方法。在你看来,这是对问题的准确描述吗?如果是这样,我会适当地编辑我的评论;如果不是,那么您将如何编辑?类方法也有一个隐藏的自参数,但它指向类对象而不是实例
此外,那些围绕+和-的括号应该围绕返回类型而不是-谢谢你的更正。已经编辑过了。我把这个放在了飞行中。@Josh-你是对的,但是当我认为问题是关于实例本身的时候,我不想弄脏水。但是谢谢你让我直截了当地讲下去。类方法也有一个隐藏的self参数,但它指向类对象而不是实例。另外,围绕+和-的括号应该围绕返回类型。@bavariable-谢谢你的更正。已经编辑过了。我把这个放在了飞行中。@Josh-你是对的,但是当我认为问题是关于实例本身的时候,我不想弄脏水。但是谢谢你让我直截了当。无意冒犯,但听起来你需要读一本入门书。从这里开始:我知道C语言和其他语言,比如Java,因此我认为我不必这么做,因为它可能没有那么大的不同。。我真的应该这么做。谢谢,没有冒犯之意,但听起来你需要读一本入门读物。从这里开始:我知道C语言和其他语言,比如Java,因此我认为我不必这么做,因为它可能没有那么大的不同。。我真的应该这么做。谢谢
NSString* test = [[NSString alloc] initWithString:@"test"];
NSString* test2 = [NSString stringWithString:@"test2"];