And*_*ann 15 oop cocoa objective-c init alloc
注意:我对Objective-C比较新,我来自Java和PHP.
有人可以向我解释为什么我总是要先分配然后初始化一个实例?
不能在这样的init方法中完成:
+ (MyClass*)init {
MyClass *instance = [MyClass alloc];
[instance setFoo:@"bla"];
return instance;
}
+ (MyClass*)initWithString:(NSString*)text {
MyClass *instance = [MyClass init];
[instance setFoo:text];
return instance;
}
...
Run Code Online (Sandbox Code Playgroud)
这只是旧C日的残骸还是有些东西我没有看到?
我知道这不是问题,因为我总是可以调用alloc和init,但由于它有点乏味,我想至少知道我为什么要这样做.
到目前为止,我喜欢语言的表达能力,但这是我想要完全理解的,以便考虑Objective-C的方式.
谢谢!
NSR*_*der 21
+ new最终向类发送+ alloc消息,并向+ alloc返回任何返回的消息.
NeXT离开Stepstone使用+ new消息(这是一个Smalltalk想法)的惯例的原因是,在早期,他们遇到了他们想要能够多次初始化同一个对象的情况.
Pet*_*sey 16
因为创建实例和初始化实例是两个单独的作业.
您向alloc
类发送消息以获取未初始化的实例.然后,您必须初始化实例,并且通常有几种方法可以执行此操作.例如:
myStr = [[NSString alloc] init]; //Empty string
myStr = [[NSString alloc] initWithFormat:@"%@.%@", parentKeyPath, key];
myStr = [[NSString alloc] initWithData:utf16data encoding:NSUnicodeStringEncoding error:&error];
myStr = [[NSString alloc] initWithContentsOfURL:URL encoding:NSUTF8StringEncoding error:&error];
Run Code Online (Sandbox Code Playgroud)
每个都以完全不同的方式初始化字符串.初始化字符串的方式取决于您要初始化它的内容.
当然,没有人喜欢写作alloc
,然后init
再autorelease
每一次,所以你通常有方便的方法(例如,stringWithFormat:
),其做三层为你的步骤.
编辑:有关此主题的更多信息,包括评论者的基本见解,请参阅我的博客文章"重新统一 ".
Dar*_*ren 12
见NSZone
.
+alloc
是一个快捷方式+allocWithZone:
,它是Cocoa为优化内存分配提供的机制.
所以你可以选择这样做:
foo = [[NSString allocWithZone:MyZone] initWithString:@"Foo"];
foo2 = [foo copyWithZone:MyZone];
Run Code Online (Sandbox Code Playgroud)
内存区域背后的想法是,如果您有大量经常分配和释放的类似对象,则为这些对象使用单独的内存区域可能更有效.
为了使分区有效,您希望+allocWithZone:
每个NSObject子类都可用,因此您需要分配分配和初始化.您可以创建和使用所需的所有快捷方式+new
,但在其下方,您只需要一个-init
初始化已分配对象的方法.
像-initWithCoder这样的Cocoa标准初始化器:无论实例的内存分配方式如何,都可以使用实例.分配和初始化分离的一个负面结果是需要了解诸如指定的初始化器之类的约定.您必须知道哪些方法被指定为初始化器以及如何在子类中创建和记录新的初始化器.从长远来看,使用指定的初始化程序简化了软件开发,但有一种观点认为,两阶段创建模式为Cocoa开发人员增加了早期学习曲线." 分配和初始化分离的一个负面结果是需要了解诸如指定的初始化器之类的约定.您必须知道哪些方法被指定为初始化器以及如何在子类中创建和记录新的初始化器.从长远来看,使用指定的初始化程序简化了软件开发,但有一种观点认为,两阶段创建模式为Cocoa开发人员增加了早期学习曲线." 分配和初始化分离的一个负面结果是需要了解诸如指定的初始化器之类的约定.您必须知道哪些方法被指定为初始化器以及如何在子类中创建和记录新的初始化器.从长远来看,使用指定的初始化程序简化了软件开发,但有一种观点认为,两阶段创建模式为Cocoa开发人员增加了早期学习曲线."
(c)Erik M. Buck和Donald A. Yacktman的可可设计模式
你不必.你可以用[MyClass new]
.这与您的假设init
方法类似.
基本上,最初没有垃圾收集的Objective-C将内存分配和类初始化的概念分开.这就是为什么有两种截然不同的方法.当你打电话时alloc
,你明确地分配了内存.
归档时间: |
|
查看次数: |
6402 次 |
最近记录: |