【问题标题】:Difference between + and - methods in Objective-cObjective-c 中 + 和 - 方法的区别
【发布时间】:2010-02-10 16:44:37
【问题描述】:

用-声明的方法和用+声明的方法有什么区别

例如

- (void)methodname

+ (void)methodname

【问题讨论】:

    标签: iphone objective-c cocoa


    【解决方案1】:

    - 为前缀的方法是实例方法。这意味着它们只能在类的实例上调用,例如:

    [myStringInstance length];
    

    + 为前缀的方法是类方法。这意味着它们可以在类上调用,而不需要实例,例如:

    [NSString stringWithString:@"Hello World"];
    

    【讨论】:

    • 只是好奇:为什么选择这种符号? +/- 对我来说有点骇人听闻(可能是因为它让我想起 perl 如何使用 '@'、'#'、'$' 来表示 something
    • 我无法评论符号的选择,因为我根本不知道......对不起。也许其他人会知道?
    • UML 肯定使用 +/-。 UML 也使用 +/- 来注释方法。但是除此之外,UML 的使用和 Obj-C 的使用完全不同。
    • @FrançoisBeausoleil 我认为 uml 使用 +/- 符号来表示公共/私有属性或功能。 (tutorialspoint.com/images/notation_class.jpg)
    【解决方案2】:

    +(void)methodname 是类变量,-(void)methodname 是对象变量。

    假设您创建了一个具有反转字符串方法的实用程序类。您称为 MYUtility 的类。

    如果你使用+,喜欢

    + (NSString *)reverse:(NSString *)stringToReverse
    

    你可以直接使用它

    NSString *reversed = [MYUtility stringToReverse:@"I Love objective C"];
    

    如果你用了-,比如

    - (NSString *)reverse:(NSString *)stringToReverse
    

    你必须使用:

    MYUtility *myUtil = [[MYUtility alloc] init];
    NSString *reversed = [myUtil stringToReverse:@"There are many ways to do the same thing"];
    

    使用基于类的函数,您只需直接调用,但您无权访问除 #defines 之外的任何局部变量,因为该类未实例化。

    但是使用 - (NSString 你必须在使用前实例化类,并且你可以访问所有局部变量。

    这不是一味的选择,很多类都有,看看 NSString 的头文件,里面到处都是 + 函数和 - 函数。

    【讨论】:

      【解决方案3】:

      减号是实例方法(只能通过实例化对象访问)

      另外还有类方法(就像在 Java Math.abs() 中,你可以在没有实例化对象的情况下使用它)

      【讨论】:

        【解决方案4】:

        根据this page

        实例方法以 - 开头,类级方法以 + 开头

        更多信息请参见this SO question

        【讨论】:

          【解决方案5】:

          第一个是实例方法,第二个是类方法。您应该阅读 Apple 的 Objective-C 文档以了解其中的区别。

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2012-10-21
            • 2010-10-08
            • 2010-11-21
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多