4

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

例如,如果您有一个像这样声明的“类变量”:

static NSString *_myString = nil

...这样做是正确的:

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

...它的缺点是调用者需要在参数上保持非零保留计数,以免它被过早释放。或者,可以这样做:

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

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

这是Apple 关于创建单例实例的文档

我正在使用的代码是非常漂亮(但仍然是新的)Objective Resource 项目(http://www.iphoneonrails.com/)。

4

2 回答 2

3

保留和释放,绝对。这不是泄漏,因为调用类的唯一时间dealloc是程序结束时——此时内存无论如何都会被释放。第一种方式会更麻烦,并且违反 Cocoa 内存管理准则。

至于是类方法还是单例:类本身一般不应该有很多独立的功能。它们只是在 Objective-C 中不是这样设计的,正如您从缺少类变量中看到的那样。类方法通常应该处理创建和管理实例,并且有时存储所有实例的共享属性或默认值。类的实际功能应该放在实例中。这是 Objective-C 中的约定。

(当然,没有 Objective-C 上帝,你可以自由地忽略约定,但这是普遍的智慧。)

于 2009-03-24T03:20:13.643 回答
3

此外,对于具有可变变体(如or )的NSString类或任何类,我强烈建议复制参数而不是保留它。如果调用者传递给你的字符串是一个,它的值可能会在以后改变,它也会在你的类中改变。这可能不是你想要的,所以我建议这样做:NSArrayNSDictionaryNSMutableString

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

copy方法制作一个副本并将保留计数设置为 1,因此就保留变量而言,您都已设置好。而且,作为额外的奖励,如果调用者确实传递给你一个NSString,那么该类足够聪明,知道它的值不能改变,所以它只是保留自己以避免制作对象的副本。这有多聪明?

于 2009-03-24T04:54:15.087 回答