2010-08-10 181 views
1

最好是在构造函数中分配实例并将实例作为自动释放返回的静态构造函数。 [String stringWithFormat...]还是最好有动态构造函数,你要求用户先分配,以便他负责释放?你应该什么时候使用每个?Objective C静态构造函数与动态构造函数

Cheers

回答

1

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

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

[[NSString alloc] initWithFormat:...]有时更清楚,这个对象的生命周期将被明确处理的读者(即用release更高版本),虽然,我发现它的情况并不少见遇到[[[NSString alloc] initWithFormat:...] autorelease]的地方。

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

例如,NSWindow是不是你创建和删除的频繁情况下的类,所以有创建NSWindow情况下,没有方便的方法,你必须要经过alloc + init路线(其实NSWindow不正常无论如何,您必须创建一个手动实例的类)。另一方面,字符串,数组,字典,集合等等,这些都是经常被创建和抛弃的东西,所以它们都有方便的方法来创建和管理它们。

+0

非常感谢。那正是我所追求的。 – ar106 2010-08-10 14:25:23

4

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

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

值得注意的是,如果你有像+stringWithFormat:这样的类方法,那么该方法应该返回一个自动释放实例。一般情况下,它将实现如下:

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

(简化为避免可变噪声)。

+0

非常感谢。诚然,我是一名C++新思维程序员。 :) – ar106 2010-08-10 14:24:29