【问题标题】:objective-c static/class method definition - what is the difference between "static" and "+"?Objective-c 静态/类方法定义 - “静态”和“+”有什么区别?
【发布时间】:2011-06-18 15:32:18
【问题描述】:

我想知道是否有人可以解释以下功能之间的区别。它们都是静态的,但需要不同的签名语法。我想知道这些在运行时是如何处理的,为什么你会使用一个而不是另一个?

+ (int) returnInt:(NSString *)myString1 withString2:(NSString *)myString2
{
    if ([myString1 isEqualToString:myString2])
        return 1;
    else 
        return 0;
}

对比

static int returnInt(NSString *myString1, NSString *myString2)
{
    if ([myString1 isEqualToString:myString2])
        return 1;
    else 
        return 0;
}

谢谢!

【问题讨论】:

  • 为了将来参考,请花时间适当地格式化您问题中的代码(使用“{}”编辑器控件)。 :-)
  • 嗯,第一个是ObjectiveC /与类有关,第二个是纯C,我不知道运行时差异。
  • 对不起,我不知道{},而且我现在正在看帖子,代码格式完美......
  • 别担心,我只是让你知道下次。 (我之前编辑了您的问题并为您修复了它。)顺便欢迎来到 Stack Overflow。 :-)

标签: iphone objective-c methods static sdk


【解决方案1】:

与(比如)C++ 中的静态成员函数只是类命名空间中的普通函数不同,Objective-C 具有适当的类方法。

由于类是对象,调用类方法实际上就像调用类的实例方法一样。这样做的主要后果是:

1) 调用类方法会产生轻微的(尽管通常无关紧要)开销,因为方法调用是在运行时解决的。

2) 类方法有一个隐含的“self”参数,就像实例方法一样。在他们的例子中,'self' 是指向类对象的指针。

3) 类方法被子类继承。

2 和 3 一起意味着你可以用类方法做这样的事情:

+ (id) instance
{
    return [[[self alloc] init] autorelease];
}

然后创建一个新类,该类继承该方法并返回其自身的新实例,而不是超类。

我相信将一个普通的 c 函数标记为静态只会使其对定义它的文件以外的文件不可用。如果你想创建一个只与一个类相关的辅助函数并且你通常会这样做想要避免污染全局命名空间。

【讨论】:

  • 嗯,按照惯例,以new 开头的方法应该返回一个保留计数为+1 的对象(不是自动释放的对象)。也许应该重命名它...
猜你喜欢
  • 2013-07-21
  • 2012-11-02
  • 2011-07-11
  • 2011-04-23
  • 1970-01-01
  • 1970-01-01
  • 2011-10-30
  • 1970-01-01
  • 2013-07-26
相关资源
最近更新 更多