【问题标题】:Objective C static vs. dynamic constructorsObjective C 静态与动态构造函数
【发布时间】:2010-08-10 12:57:40
【问题描述】:

最好有静态构造函数,在构造函数中分配实例并将实例作为自动释放返回,例如[String stringWithFormat...] 还是最好有动态构造函数,让用户先分配,以便他负责释放?你应该什么时候使用它们?

干杯

【问题讨论】:

    标签: objective-c static constructor


    【解决方案1】:

    首先,Objective-C 中没有“构造函数”这样的东西。也没有“静态与动态构造函数”。你得到了 C++ 污点,它妨碍了你理解 Objective-C 的能力! :)

    您需要阅读(并重新阅读)memory management guide

    特别针对您的问题,如果您有像+stringWithFormat: 这样的类方法,那么该方法应该返回一个自动释放的实例。一般来说,它的实现方式如下:

    + stringWithFoo: (Foo *) aFoo
    {
         return [[[self alloc] initWithFoo: aFoo] autorelease];
    }
    

    (略微简化以避免可变参数噪音)。

    【讨论】:

    • 非常感谢。的确,我是一个具有 C++ 心态的新目标 c 程序员。 :)
    【解决方案2】:

    我不确定“静态”和“动态”是否合适。

    [NSString stringWithFormat:...] 是一种方便的方法。如果您想要一个不会保留很长时间的格式化字符串,您可以使用这种便捷的方法来避免 alloc+initWithFormat:+release 可能会在您的 [否则很简单] 代码中引入的混乱。

    [[NSString alloc] initWithFormat:...] 有时对读者来说更清楚,该对象的生命周期将被显式处理(即稍后使用release),尽管我发现在某些地方遇到[[[NSString alloc] initWithFormat:...] autorelease] 并不少见。

    当您设计一个类时,您应该确定您的类的实例是否打算频繁/快速使用,而不是长期使用(或两者兼而有之)。如果您认为您的类可以被频繁或快速使用,那么提供便捷方法将有助于减少混乱并简化使用该类的代码。

    例如NSWindow不是你经常创建和删除实例的类,所以没有创建NSWindow实例的便捷方法,你必须通过alloc+init路由(事实上,NSWindow 通常不是一个你必须手动创建实例的类)。另一方面,字符串、数组、字典、集合等等,这些都是经常被创建和频繁丢弃的东西,所以它们都有方便的方法,使得它们的创建和管理更加容易。

    【讨论】:

      猜你喜欢
      • 2011-04-19
      • 2023-03-07
      • 2011-10-07
      • 2011-05-06
      • 2014-03-14
      • 2014-07-13
      • 1970-01-01
      • 1970-01-01
      • 2012-01-03
      相关资源
      最近更新 更多