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

与Java相比,Objective C中的术语和概念有哪些不同的名称?,java,objective-c,cocoa,Java,Objective C,Cocoa,我希望列出java和objective c之间的一些差异,以消除我的困惑。当我知道事情的名称时,解释我的困难就容易多了 例如: 零-零 这个自我 地图词典(甚至不太确定这本) 我要找的是与我列出的类似的比较或更正。不仅限于语言中的元素,还包括概念…接口=协议 字段=实例变量(“ivar”) ArrayList=数组 调用方法=发送消息 您列出的是正确的。关于map=dictionary,您是对的。我要补充: @public、@private、@protected(默认值)仅为实例变量(而非

我希望列出java和objective c之间的一些差异,以消除我的困惑。当我知道事情的名称时,解释我的困难就容易多了

例如:

  • 零-零
  • 这个自我
  • 地图词典(甚至不太确定这本)
我要找的是与我列出的类似的比较或更正。不仅限于语言中的元素,还包括概念…

接口=协议

字段=实例变量(“ivar”)

ArrayList=数组

调用方法=发送消息


您列出的是正确的。

关于map=dictionary,您是对的。我要补充:

  • @public、@private、@protected(默认值)仅为实例变量(而非方法),与C++的可见性修饰符类似(即,将它们声明为节头,而不是在每个变量之前)
  • 类方法类似于Java中的静态方法
  • 只有两种数据结构:NSDictionary和NSArray(在不可变和可变变体中)。这些都经过高度优化,在大多数情况下都能很好地工作。除此之外,还有
  • @接口的工作方式与Java的接口不同——它定义了单个类的实例变量和方法
  • 你需要头文件。C应该为此负责。这很糟糕,因为维护这些东西是一种不必要的痛苦
  • 没有“一揽子”的概念。最接近的东西是一个框架,但它们不应该被用作Java的包(也就是说,不要仅仅为了组织类而创建它们)
  • 而不是“new Class()”,比如[[Class alloc]init]。把“alloc”想象成新的操作符,把init想象成构造函数
  • id是通用对象指针,类似于Java中object类型的引用
  • 基类是NSObject。从NSObject继承不是自动的,必须显式指定

    • 在我的头顶上:

      • 序列化=存档
      • 实例变量通常通过属性而不是显式的get/set访问器进行访问。(在过去,我们也常常编写访问器,但即使在那时,它们的形式通常是
        foo
        /
        setFoo
        ,而不是
        getFoo
        /
        setFoo
      • 动作/按钮/鼠标/事件侦听器大致相当于
        iAction
        ,尽管Cocoa中GUI的设计方式与Java有很大不同
      • 类定义由
        @接口
        (用于实例变量和方法声明)和
        @实现
        (用于实际方法代码)指令定义,而不是一个

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

      Java

      MyClass myObject = null;
      myObject.doSomething(); <-- results in a NullPointerException
      
      MyClass myObject=null;
      
      myObject.doSomething() 对于实现FastEnumeration协议(java接口)的类,一个简单的

      for(容器中的类*元素)


      前面的答案涵盖了“短语手册”中的大部分差异,但有几个关键的概念差异值得一提。。。(请注意,我只提到纯Objective-C问题,没有提到Cocoa。)

      • 类有一个平面名称空间,协议有一个平面名称空间。没有包或包层次结构这样的东西。应用程序中的所有类名必须是不同的(所有协议名必须是不同的)。这通常通过使用~2个字母的前缀来实现
      • 异常是为异常流保留的,几乎总是程序员错误的结果。如果需要,返回一个函数可以更好地实现95%以上的Java异常
      • 考虑使用类别而不是一次性的子类,但两者都应该谨慎地进行。(类别使继承层次结构不那么受约束,但会影响类的所有实例。当您通常会对UI元素进行子类化时,它们通常是一个可靠的选择。)通常(在Objective-C和Java中),最好的解决方案是使用组合
      • 您几乎可以根据需要在任何地方使用动态键入,只需注意它是一把双刃剑。它不需要进行大量的强制转换,但是Java在编译时捕获的错误在Objective-C中被推送到运行时。静态类型可以根据需要在任何地方使用,并提供更大的编译时安全性。(Java开发人员通常将非静态类型视为语言缺陷,但最好理解它所带来的灵活性。)
      • 您可以在不使用JNI包装器的情况下自由混合使用C功能和库。但是你也能理解纯C语言的所有缺点和局限性。是的,如果我们不需要头文件,那将是一件美妙的事情,但是对于基于C的语言来说,这是不可能的。生活并不总是公平的。:-)
          关于alloc/init的哲学答案

          init不是构造函数。从概念上讲,“构造”在Objective-C中不存在。在Java(以及其他具有构造函数的语言)中,调用构造函数将返回准备就绪的对象的新实例化。Objective-C中没有与之完全等价的方法(有人可能会说,+array、+arrayWithObjects等方便类方法在技术上是构造函数,因为它们包装了分配和初始化,但我认为它们仍然不是与Java构造函数相同意义上的构造函数)

          我们所拥有的是分配和初始化的概念,这两个截然不同的步骤在一起执行时,就像它们是一个“构造函数”。类方法+alloc只是请求
          id myObject = nil;
          [myObject doSomething]; <-- is valid
          
          NSUInteger count = [[[NSArray alloc] autorelease] count];
          
          - (id) initWithAnObject:(id)anObject;
          
          - (id) initWithADifferentObject:(id)anObject;
          
          - (id) initWithCapacity:(NSUInteger)initialCapacity {
            if (self = [super init]) {
              [self setInitialCapacity:initialCapacity];
            }
            return self;
          }
          
          - (id) init {
            return [self initWithCapacity:0];
          }