InitWith方法与工厂方法

时间:2010-07-18 00:42:31

标签: objective-c cocoa class methods instance

我正在接受ObjC和Cocoa,这也是我第一次认真进军编程。

我遇到了在实例上调用的initWith方法和在类上调用的工厂方法之间的差异。

首先,为什么他们称之为“工厂”方法,对于我所谓的“InitWith”方法是否存在合适的术语?

其次,功能区别是什么?它只是内存管理的含义(工厂方法返回一个自动释放的对象)?

例如,[NSString stringWithString: (NSString*)aString][[NSString alloc] initWithString: (NSString*)aString]之间的真正区别是什么?

3 个答案:

答案 0 :(得分:5)

这些方法之间的差异在Cocoa的object ownership policy中有所描述。你拥有从-initWithString返回的对象:所以必须释放它,但你不拥有从+ stringWithString返回的对象,所以不需要释放它(此外,如果你想获得它的所有权,你必须保留它。)

调用工厂方法,因为它们为您返回一个已经创建的对象,通常使用您提供的用于配置对象的参数,以方便程序员。

答案 1 :(得分:0)

以你的

为例
 [[NSString alloc] initwithString: (NSString     
*)aString];

当你执行alloc时,你在内存中为String放置了一个空间,因此就是alloc。然后告诉它使用等于aString的字符串进行初始化。 (NSString *)是对象类型的标识符,因此您告诉它aString被声明为NSString。

我经常做类似

的事情
   NSString * aString = @"String value";

声明aString等于。

如果为了管理它而将内容分配到内存中,则需要在正确的时间释放它,例如

   -(void) dealloc {} 

您的代码部分

关于NSString的一切都可以在Apple的本文档中解释       NSString

答案 2 :(得分:0)

主要区别在于

 [NSString stringWithString:
  (NSString*)aString] 

返回一个自动释放的字符串,其内存管理无需担心,而

    [[NSString alloc] initWithString: 
     (NSString*)aString]

返回一个您负责释放的字符串。基本上前者是后者的捷径,加上自动释放。