【问题标题】:What do the plus and minus signs mean in Objective-C next to a method?Objective-C中方法旁边的加号和减号是什么意思?
【发布时间】:2023-03-04 03:04:01
【问题描述】:

在 Objective-C 中,我想知道方法定义旁边的 +- 符号是什么意思。

- (void)loadPluginsAtPath:(NSString*)pluginPath errors:(NSArray **)errors;

【问题讨论】:

    标签: objective-c syntax method-declaration


    【解决方案1】:

    (+) 表示类方法,(-) 表示实例方法,

    (+) 类方法:-

    是声明为静态的方法。无需创建类的实例即可调用该方法。类方法只能对类成员进行操作,而不能对实例成员进行操作,因为类方法不知道实例成员。类的实例方法也不能从类方法中调用,除非它们是在该类的实例上调用的。

    (-) 实例方法:-

    另一方面,需要类的实例存在才能调用它们,因此需要使用 new 关键字创建类的实例。实例方法对类的特定实例进行操作。实例方法未声明为静态。

    如何创作?

    @interface CustomClass : NSObject
    
    + (void)classMethod;
    - (void)instanceMethod;
    
    @end
    

    如何使用?

    [CustomClass classMethod];
    
    CustomClass *classObject = [[CustomClass alloc] init];
    [classObject instanceMethod];
    

    【讨论】:

      【解决方案2】:

      Apple 对此的最终解释在这里,在“方法和消息”部分下:

      https://developer.apple.com/library/mac/referencelibrary/GettingStarted/RoadMapOSX/books/WriteObjective-CCode/WriteObjective-CCode/WriteObjective-CCode.html

      简而言之:

      + 表示“类方法”

      (可以在没有实例化类的实例的情况下调用方法)。所以你这样称呼它:

      [className classMethod]; 
      


      - 表示“实例方法”

      你需要先实例化一个对象,然后才能调用对象上的方法)。您可以像这样手动实例化一个对象:

      SomeClass* myInstance = [[SomeClass alloc] init];
      

      (这实质上是为对象分配内存空间,然后在该空间中初始化对象 - 过于简单,但考虑它的好方法。您可以单独分配和初始化对象,但永远不要这样做 - 它可能导致与指针和内存管理相关的令人讨厌的问题)

      然后调用实例方法:

      [myInstance instanceMethod]
      

      在 Objective C 中获取对象实例的另一种方法是这样的:

      NSNumber *myNumber = [NSNumber numberWithInt:123];
      

      调用NSNumber 类的“numberWithInt”类方法,这是一个“工厂”方法(即为您提供对象的“现成实例”的方法)。

      Objective C 还允许使用特殊语法直接创建某些对象实例,例如这样的字符串:

      NSString *myStringInstance = @"abc";

      【讨论】:

        【解决方案3】:

        + 用于类方法,- 用于实例方法。

        例如

        // Not actually Apple's code.
        @interface NSArray : NSObject {
        }
        + (NSArray *)array;
        - (id)objectAtIndex:(NSUInteger)index;
        @end
        
        // somewhere else:
        
        id myArray = [NSArray array];         // see how the message is sent to NSArray?
        id obj = [myArray objectAtIndex:4];   // here the message is sent to myArray
        
        // Btw, in production code one uses "NSArray *myArray" instead of only "id".
        

        another question dealing with the difference between class and instance methods

        【讨论】:

        • “静态”这五个额外的字符对他们来说似乎太多了。
        • @Anon:这些方法不是静态的。它们是类方法。它们可以被覆盖,并且在很大程度上是类层次结构的一部分。 static 在 C 中意味着一些非常不同的东西。
        • @Avon,这对你来说是苹果,他们也会在他们的相机上留下一个闪光灯,并在他们的鼠标上留下一个右键。 =)
        • @bbum 很有钱。 Java 重新使用“静态”关键字来表示不同的事实并不是更古老的 C 的错。虽然它的用法在 C 中可能并不完全直观,但在 Java 中似乎更不直观。我希望静态与动态相反——它不会改变。当然,Objective-C 语言在 Apple 在 OS X 中采用它之前已经存在了将近 15 年。
        • 静态方法和类方法的区别:在MYBaseClass及其子类MYSubClass中定义方法+foo。 NSArray* classes = @[ [MYBaseClass class], [MYSubClass class] ]; [类 makeObjectsPerformSelector: @selector(foo)];不适用于静态方法。也就是说,我也更喜欢@classmethod@method 左右。为什么这么简洁……?
        【解决方案4】:

        + 方法是类方法 - 即无权访问实例属性的方法。用于不需要访问实例变量的类的 alloc 或 helper 方法等方法

        - 方法是实例方法- 与对象的单个实例相关。通常用于类中的大多数方法。

        更多详情请参阅Language Specification

        【讨论】:

        • 好吧,实际上类方法确实可以访问实例变量,它们只是没有像self 这样的实例,而是类。它们根本不与实例相关联,方法查找不是通过实例,而是通过类。不过,你可以做+exchangeIVarOf: (MYObject*)a with: (MYObject*)b { MYObject* x = a->ivar; a->ivar = b->ivar; b->ivar = x; }
        猜你喜欢
        • 2014-04-26
        • 1970-01-01
        • 2010-10-09
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-11-13
        • 2010-10-24
        • 2020-02-22
        相关资源
        最近更新 更多