【发布时间】:2010-08-10 12:57:40
【问题描述】:
最好有静态构造函数,在构造函数中分配实例并将实例作为自动释放返回,例如[String stringWithFormat...] 还是最好有动态构造函数,让用户先分配,以便他负责释放?你应该什么时候使用它们?
干杯
【问题讨论】:
标签: objective-c static constructor
最好有静态构造函数,在构造函数中分配实例并将实例作为自动释放返回,例如[String stringWithFormat...] 还是最好有动态构造函数,让用户先分配,以便他负责释放?你应该什么时候使用它们?
干杯
【问题讨论】:
标签: objective-c static constructor
首先,Objective-C 中没有“构造函数”这样的东西。也没有“静态与动态构造函数”。你得到了 C++ 污点,它妨碍了你理解 Objective-C 的能力! :)
您需要阅读(并重新阅读)memory management guide。
特别针对您的问题,如果您有像+stringWithFormat: 这样的类方法,那么该方法应该返回一个自动释放的实例。一般来说,它的实现方式如下:
+ stringWithFoo: (Foo *) aFoo
{
return [[[self alloc] initWithFoo: aFoo] autorelease];
}
(略微简化以避免可变参数噪音)。
【讨论】:
我不确定“静态”和“动态”是否合适。
[NSString stringWithFormat:...] 是一种方便的方法。如果您想要一个不会保留很长时间的格式化字符串,您可以使用这种便捷的方法来避免 alloc+initWithFormat:+release 可能会在您的 [否则很简单] 代码中引入的混乱。
[[NSString alloc] initWithFormat:...] 有时对读者来说更清楚,该对象的生命周期将被显式处理(即稍后使用release),尽管我发现在某些地方遇到[[[NSString alloc] initWithFormat:...] autorelease] 并不少见。
当您设计一个类时,您应该确定您的类的实例是否打算频繁/快速使用,而不是长期使用(或两者兼而有之)。如果您认为您的类可以被频繁或快速使用,那么提供便捷方法将有助于减少混乱并简化使用该类的代码。
例如NSWindow不是你经常创建和删除实例的类,所以没有创建NSWindow实例的便捷方法,你必须通过alloc+init路由(事实上,NSWindow 通常不是一个你必须手动创建实例的类)。另一方面,字符串、数组、字典、集合等等,这些都是经常被创建和频繁丢弃的东西,所以它们都有方便的方法,使得它们的创建和管理更加容易。
【讨论】: