我选择了ObjC和Cocoa,这也是我第一次正式涉足编程领域。
我遇到了在实例上调用的initWith方法和在类上调用的工厂方法之间的区别。
首先,为什么它们被称为“工厂”方法,对于我所称的"InitWith“方法,是否有一个合适的术语?
其次,功能上的区别是什么?只是内存管理方面的问题(工厂方法返回一个自动释放的对象)?
例如,[NSString stringWithString: (NSString*)aString]和[[NSString alloc] initWithString: (NSString*)aString]之间的真正区别是什么
发布于 2010-07-18 17:05:55
在Cocoa的object ownership policy中描述了这两种方法之间的区别。您拥有从-initWithString:返回的对象,因此必须释放它,但是您不拥有从+stringWithString返回的对象,因此不需要释放它(此外,如果您确实想要获得它的所有权,则必须保留它)。
工厂方法之所以被称为工厂方法,是因为它们会为您返回一个已经创建的对象,通常带有您提供的用于配置对象的参数,以方便程序员。
发布于 2010-07-18 09:03:12
在您的示例中
[[NSString alloc] initwithString: (NSString
*)aString];当您执行分配时,您在内存中为字符串放置了一个空间,因此是分配。然后告诉它使用等于aString的字符串进行初始化。(NSString *)是对象类型的标识符,所以您告诉它aString被声明为NSString。
我通常会做这样的事情
NSString * aString = @"String value";声明aString等于什么。
如果您将某些内容分配到内存中以对其进行管理,则需要在正确的时间释放它,例如
-(void) dealloc {} 部分的代码。
关于NSString的一切都可以在苹果NSString的文档中得到解释
发布于 2010-07-18 09:11:27
主要区别在于
[NSString stringWithString:
(NSString*)aString] 返回一个自动释放的字符串,您无需担心其内存管理,而
[[NSString alloc] initWithString:
(NSString*)aString]返回一个由您负责释放的字符串。基本上,前者是后者的捷径,外加自动释放。
https://stackoverflow.com/questions/3273857
复制相似问题