2010-07-18 89 views
6

我正在捡起ObjC和Cocoa,这也是我第一次对编程进行一次严肃的尝试。初始方法与工厂方法

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

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

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

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

回答

5

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

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

0

在您的

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

当你要放置在一个字符串中的空间记忆因此ALLOC一个ALLOC例子。然后,您会告诉它使用等于aString的字符串进行初始化。 (NSString *)是对象类型的标识符,所以您告诉它将aString声明为NSString。

我平时做这样的事情

NSString * aString = @"String value"; 

声明什么ASTRING等于。

如果你的Alloc东西到内存中以便管理它,你将需要在正确的时间将其释放,如你的代码的

-(void) dealloc {} 

部分

约NSString的一切都可以被解释苹果本文档 NSString

+0

这适用于你,Rugluds和Audacitor:发送'initWithString:'消息时,不需要包含'(NSString *)'。只有方法的声明需要它(指定方法期望的类型)。当你将它作为消息的一部分加入时,你正在将'aString'值转换为'NSString *'。如果'aString'是'NSString *',那么这什么都不做,也是不必要的。如果它是别的东西,那么演员阵容仍然没有任何用处:它会关闭编译器,但是你会在运行时崩溃。 – 2010-07-18 03:15:08

0

的主要区别是,

[NSString stringWithString: 
    (NSString*)aString] 

返回一个自动释放字符串,它的内存管理,你不用担心,而

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

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

+1

好吧,“你的内存管理你不用担心”并不完全是这样,并可能导致一个新人误入歧途...... 例如,如果你将结果赋给一个实例变量(1)我们希望保留类方法的结果,否则你会发现当你访问你的实例var时,它会消失。对于ObjC/Cocoa新手来说,这是一个典型的错误。 (1)通过属性属性设置一个实例变量,该实例变量不是具有合成设置器的属性。 – Dad 2010-07-18 01:19:23

+1

另一个常见的错误是将实例变量与属性混淆。您声明属性的内存管理策略(例如'retain')对实例变量没有影响;对实例变量的分配总是发生在没有副作用的情况下,包括无保留或副本。因此,在分配给伊娃时,您需要自行保留或复制该值。只有分配给一个属性可以为你做到这一点。 – 2010-07-18 03:07:36