我正在接受ObjC和Cocoa,这也是我第一次认真进军编程。
我遇到了在实例上调用的initWith方法和在类上调用的工厂方法之间的差异。
首先,为什么他们称之为“工厂”方法,对于我所谓的“InitWith”方法是否存在合适的术语?
其次,功能区别是什么?它只是内存管理的含义(工厂方法返回一个自动释放的对象)?
例如,[NSString stringWithString: (NSString*)aString]
和[[NSString alloc] initWithString: (NSString*)aString]
之间的真正区别是什么?
答案 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]
返回一个您负责释放的字符串。基本上前者是后者的捷径,加上自动释放。