我希望列出java和objective之间的一些不同之处,以减少我的困惑。当我知道什么叫什么的时候,解释我的困难就更容易了。
例如:
我正在寻找的是类似的比较或更正,我已经列出了。不仅限于语言中的元素,还包括概念.
发布于 2009-08-01 22:30:44
你说的地图=字典是对的。我将补充如下:
发布于 2009-08-02 11:39:38
另一个概念上的区别是在空对象上调用方法(发送消息)时的行为(到零)。
Java
MyClass myObject = null;
myObject.doSomething(); <-- results in a NullPointerExceptionObj-C
id myObject = nil;
[myObject doSomething]; <-- is valid关于这种行为,这里是一个很好的问题。
发布于 2009-08-02 18:07:23
关于alloc/init的哲学回答。
init不是构造函数。在概念上,“构造”并不存在于目标C中。在Java (以及带有构造函数的其他语言)中,调用构造函数将返回准备就绪的对象的新实例化。在目标C中,没有与此完全相同的内容。(人们可能会说,诸如+数组、+arrayWithObjects等方便类方法在技术上是构造函数,因为它们同时包装了分配和初始化,但我认为它们仍然不是与Java构造函数相同的构造函数。)
相反,我们拥有的是分配和初始化的概念,这两个不同的步骤在一起执行时,就好像它们是一个“构造函数”。class方法+alloc只是从系统中请求一个适当大小的内存块。IIRC,它使用calloc()函数来做到这一点。不能保证在执行alloc函数的过程中进行任何归零。这意味着我们需要自己进行初始化,这是通过立即调用-init方法来完成的。
然而,-init (和所有导数)只不过是普通的实例方法。您可以随时向它们发送消息,以便将对象实例“重置”到其原始的初始化状态(尽管这样做会产生一些内存管理后果,必须加以考虑)。这也意味着你可以做这样荒谬的事情:
NSUInteger count = [[[NSArray alloc] autorelease] count];我想不出你为什么要这么做的原因,但重点是你能做到。它进一步强调init不是构造函数。在上面的示例中,该对象在+alloc方法返回时存在。但是,它可能没有被正确初始化,这意味着无符号整数“计数”可能不是零。可能是这样,但依赖于这种行为是不正确的(当然,除非另有记录)。
将构造分解为分配和初始化的优点之一是,我们可以在很大程度上控制被初始化的内容。例如,在Java中,每个方法签名只能有一个构造函数。换句话说,如果您有一个使用单个"Object“参数的构造函数,那么这是唯一可以这样做的构造函数。您不能创建另一个也接受单个对象参数的构造函数。
在Objective中,参数类型不是方法签名(称为“选择器”)的一部分,因此我可以创建如下所示的初始化器:
- (id) initWithAnObject:(id)anObject;但是,我也可以创建另一个初始化器:
- (id) initWithADifferentObject:(id)anObject;我可以将它们设置为对调用它们的对象执行完全不同的初始化。这真是太有用了!
将构造拆分为分配和初始化的另一个非常有用的方面是,您可以链接初始化器。AFAIK,您不能在像Java这样的语言中从构造函数中调用构造函数(当然可以,但是它没有相同的效果)。然而,在目标C中,您可以这样做:
- (id) initWithCapacity:(NSUInteger)initialCapacity {
if (self = [super init]) {
[self setInitialCapacity:initialCapacity];
}
return self;
}
- (id) init {
return [self initWithCapacity:0];
}现在,当您分配/ init这样设置的对象时,它将“重定向”并使用initWithCapacity初始化器,即使您调用了init。(这是NSArray的init方法的工作方式)这意味着您可以使用条件初始化器。例如,让您的-init方法在特定条件下分派给一个初始化器,但在不同条件下使用不同的初始化器。
总之,Objective模型“分配和初始化”比构造的概念要强大得多。作为程序员,您对对象的初始设置阶段有更大程度的控制。这是一个真正的解放的转变。
ps - init不是构造函数!)
https://stackoverflow.com/questions/1217606
复制相似问题