Objective-J简明教程3-3:内存管理、类目、作用域
2009年06月1日 Web开发, 翻译
官方网站原文:Learning Objective-J
JavaScript有垃圾收集机制,Objective-J同样也有,因此Objective-C中出现的保持或释放内存的代码,在Objective-J中是看不到的。DOM操作导致的很多常见的内存泄漏问题,Cappuccino框架可以帮我们处理。
但这并不是说对象不可能泄漏。任何垃圾收集语言(language),都有可能偶尔保持对象引用而不释放,这一点应该正确看待。
类目
通过类目(Categories)可以为类添加方法,而不必创建新的子类或修改类的源代码。当类目被加载后,新方法(或方法)就会变成所有类实例的一部分。
这一特性在很多情况下都很有用,例如,可以利用它为内置类添加方法。假设我们想让所有CPString对象都具有一个能够返回反转字符串的方法,可以像下面这样定义一个类目:
- @import <Foundation/CPString.j>
- @implementation CPString (Reversing)
- - (CPString)reverse
- {
- var reversedString = "",
- index = [self length];
- while(index--)
- reversedString += [self characterAtIndex:index];
- return reversedString;
- }
- @end
这样,就可以在任何字符串上调用reverse来取得反转字符串了。
- var myString = "hello world";
- var reversed = [myString reverse];
- alert(reversed); // alerts "dlrow olleh"
定义类目的语法是@implementation,后跟要添加到的那个类,再后跟括在括号中的类目名称。在@end关键字之前添加的任何方法,都将成为类目的一部分。注意,不能通过类目添加实例变量,尽管可以动态修改JavaScript对象,也不能添加。
在上面reverse方法的实现中,有几个特别值得一提的地方。例如,reversedString是按照声明JavaScript字符串的典型方式声明的。这完全归功于一种名叫“免费(toll-free)”的技术,借助该技术任何JavaScript对象(如数组或字符串),可以同时作为JavaScript对象和Cappuccino对象存在。因此,这个字符串可以调用CPString的length和characterAtIndex:等方法,也可以调用现有的JavaScript方法和运算符(如+)。
作用域
多数情况下,Objective-J与JavaScript的作用域规则是相同的。没有以var特别声明的变量就是全局变量,而使用var声明的变量则具有函数/方法级的作用域。不符合这两条规则的变量是实例变量和文件作用域变量。
本教程前面曾介绍过,实例变量通过@implementation块声明。当在类中使用那些变量时,它们具有对象级作用域——不是全局作用域,只属于每个对象实例。但是,如果忘记声明了某个实例变量,那么该变量就像在JavaScript代码中一样,会变成全局变量。
文件作用域变量则是Objective-J新引入的一种变量。如果是在函数或方法实现的外部使用var关键字声明一个变量,则该变量(有时候也称其为静态变量)就具有文件级作用域。这种变量可以被同一文件中的其他代码访问。这种变量对于不依赖全局对象而实现各种共享对象的技术提供了便利。如果文件中只包含一个类,也可以把这种变量看成是“类变量”。
以下代码展示了Objective-J中主要的作用域规则:
- globalScoped = "this becomes global"; //这是一个全局变量
- var fileScoped = "this stays scoped in the file"; //这样可以把作用域限制在文件中
- @implementation Foo : CPObject
- {
- CPString objectScoped;
- }
- - (void)baz
- {
- var methodScoped;
- methodScoped = "function scope, declared with var"; //通过var声明的变量具有函数级作用域
- anotherGlobal = "global scope, no var"; //没有使用var声明的变量具有全局作用域
- objectScoped = "still object scoped"; //仍然还具有对象级作用域
- fileScoped = "still file scoped"; //仍然还具有文件级作用域
- }
- @end
结束语
Objective-J简明教程至此就结束了。这门语言只是对JavaScript简单而直观的扩展,绝大多数开发人员不用费吹灰之力即可掌握它。
要想参考本教程中完整的代码清单,可以下载这个Person.j文件。
本博客专注于Web前后端技术和技术翻译。目前正在翻译《JavaScript高级程序设计(第2版)》。新浪微博(t.sina.com.cn/lisf),Twitter(@cncuckoo,仅仅用于跟踪国外牛人;我翻不了墙,无法接受各位朋友的follow,抱歉!)
[...] Objective-J简明教程3-3:内存管理、类目、作用域 五月 31st, 2009 in Web开发, [...]