代码之家  ›  专栏  ›  技术社区  ›  Frank Schmitt

Objective-C类方法的对象保持行为

  •  4
  • Frank Schmitt  · 技术社区  · 16 年前

    保留和释放传递给类方法的对象的最佳实践是什么?

    例如,如果有一个“类变量”声明如下:

    static NSString *_myString = nil
    

    …这样做是正确的:

    + (void)myClassMethod:(NSString *)param {
        _myString = param;
    }
    

    …这有一个缺点,即调用者需要保持参数的非零保留计数,以免过早释放参数。或者可以这样做:

    + (void)myClassMethod:(NSString *)param {
        [_myString autorelease];
        _myString = [param retain];
    }
    

    …其缺点是没有相应的类级别 dealloc 调用它会泄漏内存。或者应该完全避免这种类变量的欺骗,也许用一个更传统的方式管理这些对象的生命周期的单例类?

    这里是 Apple's docs on creating a singleton instance .

    我正在使用的代码是非常灵活(但仍然是新的)目标资源项目( http://www.iphoneonrails.com/ )

    2 回复  |  直到 16 年前
        1
  •  3
  •   Chuck    16 年前

    绝对保留和释放。这不是泄密,因为只有在课堂上 dealloc 会被调用是指当程序结束时,内存无论如何都会被释放。第一种方法会更麻烦,而且违背了Cocoa内存管理指南。

    至于它应该是类方法还是单例方法:类本身通常不应该有很多独立的功能。在Objective-C中,它们并不是这样设计的,从类变量的缺乏可以看出。类方法通常应处理创建和管理实例,有时还应存储所有实例的共享属性或默认值。类的实际功能应该放在实例中。这就是目标C中的惯例。

    (当然,没有客观的上帝,你可以随意忽略惯例,但这是一般的智慧。)

        2
  •  3
  •   Alex    16 年前

    另外,在 NSString 或任何具有可变变量的类(如 NSArray NSDictionary )强烈建议复制参数,而不是保留它。如果调用者传递的字符串是 NSMutableString ,它的值稍后可能会更改,并且在类中也会更改。这可能不是你想要的,所以我建议你这样做:

    + (void)myClassMethod:(NSString *)param {
        [_myString release];
        _myString = [param copy];
    }
    

    这个 copy 方法生成一个副本,并将保留计数设置为1,这样就可以保留变量了。作为额外的奖励,如果来电者确实通过了 非字符串 ,该类足够智能,可以知道其值不能更改,因此它只保留自身以避免复制对象。这有多聪明?