Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/objective-c/26.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Objective c 定义方法的属性时,+和-之间有什么区别?_Objective C_Ios_Macos_Cocoa - Fatal编程技术网

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"];