官方网站原文:Learning Objective-J


使用对象和类

了解了Objective-J对象和类的基本情况下,接下来我们看一看如何使用它们。下面的代码创建一个新Person对象,并设置了其name属性:

  1. var myPerson = [[Person alloc] init];
  2. [myPerson setName:"John"];

Objective-J中的方法调用叫做“消息”(messages),为对象发送消息需要使用方括号表示法,如:[object message]。如前所述,有些方法是类方法,要通过类来调用——alloc就是一个类方法。Objective-J中的每个类都有一个名叫alloc的特殊的类方法,该方法返回相应类的一个新实例。

上面的例子在Person类上调用了alloc方法,结果返回了一个Person实例。然后,我们又调用了该实例的init方法。无论alloc还是init都返回一个对象的引用,而我们把这个对象赋给了变量myPerson。就像alloc一样,每个类都会从CPObject继承init方法。

alloc类方法与JavaScript、C++及Java语言中的new关键字相似,都是创建新的实例。而init实例方法则与这些语言中的构造器相似,都是对新创建的实例执行初始化。

有一些会指定自定义的init方法,如CPView的自定义init方法签名如下:

  1. - (id)initWithFrame:(CGRect)aFrame

每个子类都要确保调用其父类的init方法。以下是前面Person类的自定义init方法,该方法直接接收名字参数:

  1. - (id)initWithName:(CPString)aName
  2. {
  3.     self = [super init];
  4.     if (self)
  5.     {
  6.         name = aName;
  7.     }
  8.     return self;
  9. }

首先,调用超类的init方法,结果会返回一个对新初始化实例的引用。此时,必须把这个引用赋值给self变量(以防超类的init方法因新实例而抛弃原始的实例)。然后,检查self确保其正确返回,如果检查通过则执行针对当前类的操作,即把aName赋值给name。最后,返回self以便调用代码获得这个新初始化对象的引用。

Objective-J中的self等价于JavaScript中的this。可以说this引用JavaScript对象,而self引用Objective-J对象。与JavaScript类似,self.foo引用的是foo实例变量;但与JavaScript不同的是,self不是必需的,即可以在任何实例方法中使用foo。

Cappuccino中的很多类都为创建对象提供了一种略有不同的模型,但却更加便捷。在创建对象时,这些类不调用alloc和init,而是实现各自的类方法以返回新对象。注意,在类方法中,self引用类自身。

  1. + (id)personWithName:(CPString)aName
  2. {
  3.     return [[self alloc] initWithName:aName];
  4. }

可以像下面这样调用这个类方法:

  1. var joe = [Person personWithName:"Joe"];

导入代码

JavaScript所欠缺的一种众望所归的特性,就是以像Java或C一样的方式导入代码。对此,Objective-J添加了@import语句:

  1. @import <Foundation/CPObject.j>
  2. @import <AppKit/CPView.j>
  3. @import "MyClass.j"

有两种类型的导入语句。尖括号表示框架代码,而引号表示本地项目代码。导入框架代码时,会使用内置的搜索路径机制从定义的位置中搜索目标文件。而导入本地代码时,则只会查找与导入文件相关的位置。

相关内容

Objective-J简明教程3-1:类、方法
Objective-J简明教程3-3:内存管理、类目、作用域



朋友们的留言

  1. 为之漫笔 » Blog Archive » Objective-J简明教程3-1:类、方法 | 五月 31st, 2009 at 22:33

    [...] Objective-J简明教程3-2:使用对象和类、导入代码 Objective-J简明教程3-3:内存管理、归类、作用域 五月 26th, 2009 in Web开发, 翻译 [...]

  2. 再来看看 | 八月 13th, 2009 at 18:41

    不好意思留下足迹,请博主见谅!

  3. 清除负面信息 | 八月 18th, 2009 at 13:59

    very good site!

我来说两句儿


麻烦输入验证码 If you cannot see the CheckCode image,please refresh the page again!