首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >与Java相比,目标C中的术语和概念有哪些不同的名称?

与Java相比,目标C中的术语和概念有哪些不同的名称?
EN

Stack Overflow用户
提问于 2009-08-01 22:14:10
回答 7查看 357关注 0票数 10

我希望列出java和objective之间的一些不同之处,以减少我的困惑。当我知道什么叫什么的时候,解释我的困难就更容易了。

例如:

  • 零零
  • 这个自我
  • 地图字典(甚至不太确定这个)

我正在寻找的是类似的比较或更正,我已经列出了。不仅限于语言中的元素,还包括概念.

EN

回答 7

Stack Overflow用户

回答已采纳

发布于 2009-08-01 22:30:44

你说的地图=字典是对的。我将补充如下:

  • @public、@private、@protected (默认)仅是变量(而不是方法),其工作方式类似于C++的可见性修饰符(即您将它们声明为节标题,而不是在每个变量之前)。
  • 类方法与Java中的静态方法类似
  • 只有两种数据结构: NSDictionary和NSArray (不可变和可变变体)。这些都是高度优化的,并且在大多数情况下运行良好。对于其他一切,都有CHDataStructures
  • @接口不像Java的接口那样工作-它定义单个类的实例变量和方法。
  • 你需要头文件。这件事应归咎于C。这很糟糕,因为维护这些东西是一种不必要的痛苦。
  • 没有“一揽子”的概念。最接近的是一个框架,但不应该将其用作Java的包(也就是说,不要仅仅为了组织类而创建它们)。
  • 而不是"new ()“,比如[Class alloc init]。把"alloc“像新的操作符一样想一想,init作为构造函数。
  • id是泛型的对象指针,类似于Java中对象类型的引用。
  • 基类是NSObject。来自NSObject的继承不是自动的,必须显式指定。
票数 12
EN

Stack Overflow用户

发布于 2009-08-02 11:39:38

另一个概念上的区别是在空对象上调用方法(发送消息)时的行为(到零)。

Java

代码语言:javascript
复制
MyClass myObject = null;
myObject.doSomething(); <-- results in a NullPointerException

Obj-C

代码语言:javascript
复制
id myObject = nil;
[myObject doSomething]; <-- is valid

关于这种行为,这里是一个很好的问题。

票数 3
EN

Stack Overflow用户

发布于 2009-08-02 18:07:23

关于alloc/init的哲学回答。

init不是构造函数。在概念上,“构造”并不存在于目标C中。在Java (以及带有构造函数的其他语言)中,调用构造函数将返回准备就绪的对象的新实例化。在目标C中,没有与此完全相同的内容。(人们可能会说,诸如+数组、+arrayWithObjects等方便类方法在技术上是构造函数,因为它们同时包装了分配和初始化,但我认为它们仍然不是与Java构造函数相同的构造函数。)

相反,我们拥有的是分配和初始化的概念,这两个不同的步骤在一起执行时,就好像它们是一个“构造函数”。class方法+alloc只是从系统中请求一个适当大小的内存块。IIRC,它使用calloc()函数来做到这一点。不能保证在执行alloc函数的过程中进行任何归零。这意味着我们需要自己进行初始化,这是通过立即调用-init方法来完成的。

然而,-init (和所有导数)只不过是普通的实例方法。您可以随时向它们发送消息,以便将对象实例“重置”到其原始的初始化状态(尽管这样做会产生一些内存管理后果,必须加以考虑)。这也意味着你可以做这样荒谬的事情:

代码语言:javascript
复制
NSUInteger count = [[[NSArray alloc] autorelease] count];

我想不出你为什么要这么做的原因,但重点是你能做到。它进一步强调init不是构造函数。在上面的示例中,该对象在+alloc方法返回时存在。但是,它可能没有被正确初始化,这意味着无符号整数“计数”可能不是零。可能是这样,但依赖于这种行为是不正确的(当然,除非另有记录)。

将构造分解为分配和初始化的优点之一是,我们可以在很大程度上控制被初始化的内容。例如,在Java中,每个方法签名只能有一个构造函数。换句话说,如果您有一个使用单个"Object“参数的构造函数,那么这是唯一可以这样做的构造函数。您不能创建另一个也接受单个对象参数的构造函数。

在Objective中,参数类型不是方法签名(称为“选择器”)的一部分,因此我可以创建如下所示的初始化器:

代码语言:javascript
复制
- (id) initWithAnObject:(id)anObject;

但是,我也可以创建另一个初始化器:

代码语言:javascript
复制
- (id) initWithADifferentObject:(id)anObject;

我可以将它们设置为对调用它们的对象执行完全不同的初始化。这真是太有用了!

将构造拆分为分配和初始化的另一个非常有用的方面是,您可以链接初始化器。AFAIK,您不能在像Java这样的语言中从构造函数中调用构造函数(当然可以,但是它没有相同的效果)。然而,在目标C中,您可以这样做:

代码语言:javascript
复制
- (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不是构造函数!)

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/1217606

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档