Cocoa开发的未来路径探索
在Cocoa开发的领域中,有许多新兴的技术和方法值得我们去深入了解。下面将为大家详细介绍一些关键的内容。
通知与块的应用
在开发过程中,通知的处理是一个重要的环节。当网络读取对象需要广播其状态时,可以通过以下方式实现:
if (some condition is met) {
[[NSNotificationCenter defaultCenter]
postNotificationName:DATA_RECEIVED
object:self];
}
通知器不仅可以简单地发出通知,还能通过字典的形式传递额外信息,观察者可以获取这些信息:
// 在通知器中
NSDictionary *info = [NSDictionary dictionaryWithObject:someData
forKey:@"data"];
[[NSNotificationCenter defaultCenter]
postNotificationName:DATA_RECEIVED
object:self userInfo:info];
// 在观察者中
NSLog(@"received data %@", [[notification userInfo]
objectForKey:@"data"]);
块(Blocks)是苹果为C语言引入的一个强大特性,在Snow Leopard中得到了广泛应用。苹果扩展了多个Cocoa类,新增了许多以块为参数的方法。
枚举方式
我们先来看看不同的枚举方式。在处理列表时,常见的有以下几种枚举方法:
NSArray *array = [NSArray arrayWithObjects:@"one", "two", @"three"];
// C风格枚举
int i;
for (i = 0; i < [array count]; i++) {
NSLog(@"C enumeration accessing object: %@",
[array objectAtIndex:i]);
}
// NSEnumerator,经典的Cocoa枚举方式
NSEnumerator *aEnum = [array objectEnumerator];
id obj1;
while ((obj1 = [aEnum nextObject])) {
NSLog(@"NSEnumerator accessing object: %@", obj1);
}
// 快速枚举,自Leopard版本开始可用
id obj2;
for (obj2 in array) {
NSLog(@"Fast enumeration accessing object: %@", obj2);
}
// 块枚举,Snow Leopard中的新特性
[array enumerateObjectsUsingBlock:^(id obj3, NSUInteger i, BOOL *stop) {
NSLog(@"Block enumeration accessing object: %@", obj3);
}];
块枚举传递的块接受三个参数,无返回值。它结合了其他枚举方式的优点,能提供当前对象的索引,方便打印数组元素的编号列表。此外,还有一种变体方法可以指定枚举的运行选项,如并发运行:
[array enumerateObjectsWithOptions:NSEnumerationConcurrent
usingBlock:^(id obj3, NSUInteger i, BOOL *stop) {
NSLog(@"Block enumeration accessing object: %@", obj3);
}];
这种方法利用Grand Central Dispatch(GCD)将工作分配到所有可用的处理器核心,能让应用运行更快,更好地利用系统资源。
NSSet类也有类似的枚举方法,但没有索引参数,因为集合中的对象是无序的。NSDictionary也新增了一些块相关的方法,如
enumerateKeysAndObjectsUsingBlock:
,能同时获取键和值,比以前的枚举方式更高效。
用块观察通知
苹果还将块的概念应用到了
NSNotification
类中。在Snow Leopard中,有一个新方法可以指定块而不是选择器:
[[NSNotificationCenter defaultCenter] addObserverForName:DATA_RECEIVED
object:nil queue:nil usingBlock:^(NSNotification *notification){
NSLog(@"received notification: %@", notification);
}];
这种方式的好处在于,它无需为通知处理代码创建单独的方法,使代码更易读。而且,块能获取其定义位置的上下文,不仅可以访问实例变量,还能访问同一方法中先前定义的局部变量。
过滤操作
NSArray
的
indexesOfObjectsPassingTest:
方法也是块的一个应用。通过这个方法,我们可以定义一个块来检查对象,并根据自定义的条件决定是否将其包含在结果索引集中。例如,查找数组中所有名为“Bob”的人:
NSArray *people; // <- 假设这个数组存在
NSIndexSet *bobIndexes = [people indexesOfObjectsPassingTest:
BOOL ^(id obj, NSUInteger idx, BOOL *stop){
return [obj.firstName isEqual:@"Bob"];
}];
NSArray *bobs = [people objectsAtIndexes:bobIndexes];
用其他语言进行Cocoa开发
虽然Objective - C在Cocoa开发中占据重要地位,但也有很多开发者希望使用其他语言进行开发。不过,像C++和Java这样的流行语言,由于缺乏运行时自省能力,难以与复杂的Objective - C类库(如Cocoa)进行全面交互。苹果曾尝试为Java搭建桥梁,但由于开发者使用意愿不高以及技术实现和维护的挑战,最终放弃了该项目。而Objective - C++在一定程度上减少了C++与Objective - C之间的桥接需求,但也存在一些限制,比如不能直接用C++类实现Objective - C委托,需要创建“胶水类”。
不过,一些使用量逐年增长的语言,如Python和Ruby,有可靠的桥接方式来进行Cocoa开发。
PyObjC
PyObjC是最早将非Objective - C语言与Cocoa框架进行桥接的项目之一。它为Cocoa中所有Objective - C类的方法提供映射,使开发者可以从Python中调用这些方法。映射规则很简单,将整个Objective - C方法名合并为一个符号,方法名中的冒号用下划线替换,方法参数放在括号内。所有对象会自动桥接,因此可以直接在Python中使用标准的Cocoa类。例如,通知相关代码的Objective - C版本和Python版本对比:
// Objective - C版本
[[NSNotificationCenter defaultCenter]
postNotificationName:DATA_RECEIVED object:self];
# Python版本,使用PyObjC
center = NSNotificationCenter.defaultCenter()
center.postNotificationName_object_(DATA_RECEIVED, self);
可以看出,Python版本缺乏方法名和参数的混合,影响了代码的可读性,整体也不太符合Python的风格。不过,Leopard和Snow Leopard都包含了PyObjC,Xcode甚至提供了使用它创建应用项目的模板。
MacRuby
在Ruby方面,有RubyCocoa和MacRuby两种桥接方式。RubyCocoa近年来发展停滞,而MacRuby是苹果赞助的新项目,它以全新的方式将Ruby语法引入Cocoa。MacRuby摒弃了现有的Ruby标准库类,使用Cocoa的等效类,并为它们添加与Ruby世界中名称匹配的新方法。这意味着有经验的Ruby开发者在使用MacRuby时,可能会发现很多熟悉的类和方法缺失或有细微差异。
MacRuby在方法调用上更接近Objective - C的风格,通过巧妙使用Ruby的键值参数来查找匹配的Objective - C方法。例如:
// Objective - C版本
[[NSNotificationCenter defaultCenter]
postNotificationName:DATA_RECEIVED object:self];
# MacRuby版本
center = NSNotificationCenter.defaultCenter
center.postNotificationName(DATA_RECEIVED, object:self)
此外,MacRuby还提供了一些有趣的特性,如即时编译和提前编译为本地代码,并且采用了基于LLVM的新运行时。目前MacRuby还不到两年,尚未发布1.0版本,但值得关注,更多信息可访问http://www.macruby.org 。
Nu
Nu是一种专门为与Objective - C互操作而设计的新语言,实际上是Lisp的变体。它具有与Objective - C相似的方法和参数交织的语法。例如:
// Objective - C版本
[[NSNotificationCenter defaultCenter]
postNotificationName:DATA_RECEIVED object:self];
// Nu版本
((NSNotificationCenter defaultCenter)
postNotificationName:DATA_RECEIVED object:self)
除了语言本身,Nu还包含命令行shell(nush)、类似make的工具(nuke)等。这些工具让开发者可以启动shell,使用熟悉的Cocoa类进行临时脚本编写,与实时对象交互,探索Cocoa框架。更多信息可访问http://programming.nu 。
JavaScript
JavaScript在某种程度上是个特殊的存在。Mac OS X中的WebKit框架虽然不能让我们用JavaScript创建整个应用,但可以构建一个脚本层,让熟悉JavaScript的人定义应用中的部分行为。通过WebKit的WebView类,可以调用JavaScript函数,也可以将Objective - C对象暴露给JavaScript解释器。
此外,还有第三方的JSCocoa,它使用与WebKit相同的JavaScript引擎(JavaScriptCore)将JavaScript与Cocoa完全桥接,让开发者可以用JavaScript编写完整的Cocoa应用。JSCocoa的一个优点是,它的JavaScript语法与Objective - C非常相似:
// Objective - C版本
[[NSNotificationCenter defaultCenter]
postNotificationName:DATA_RECEIVED object:self];
// JSCocoa版本
[[NSNotificationCenter defaultCenter]
postNotificationName:DATA_RECEIVED object:self]
更多关于JSCocoa的信息可访问http://inexdo.com/JSCocoa 。
F - Script
F - Script在Cocoa开发的替代语言讨论中也不可忽视。它有两个主要用途:一是可以嵌入到应用中,为应用添加用户脚本功能,包括用于输入和测试F - Script语言脚本的GUI组件;二是为开发者提供交互式命令shell和图形浏览器,用于探索运行中的应用,检查对象属性,遍历对象关系等。所有Cocoa开发者都应该了解这个工具,可访问http://www.fscript.org 进行尝试。
移植的Cocoa技术
Cocoa和类Cocoa技术在其他领域也有应用。
Cocoa Touch
随着iPhone开发的迅猛发展,iPhone的Cocoa Touch框架与我们之前介绍的Cocoa框架有所不同。Cocoa的核心类分布在Foundation和AppKit两个框架中,而在iPhone的Cocoa Touch中,Foundation框架基本相同,但AppKit被UIKit取代。
UIKit的很多基本功能与AppKit相似,但针对小型、支持加速度计的触摸屏设备进行了优化。每个应用有一个单一的UIWindow用于所有绘图,UIWindow包含UIView子类的层次结构。UIKit还提供了处理多点触摸和设备移动的事件输入方式。
与AppKit相比,UIKit摒弃了一些过时的API和类,如独立于视图的单元格类概念。而且,UIKit更充分地利用了Objective - C 2.0的属性,为大多数可配置属性提供了声明属性。
不过,Cocoa Touch也有一些限制。目前iPhone上没有垃圾回收机制,代码需要使用引用计数系统;没有Cocoa Bindings,但有KVC和KVO;也没有块。虽然苹果有可能在未来将这些技术移植到iPhone上,但短期内不太可能。
GNUstep和Cocotron
GNUstep和Cocotron是可以运行类Cocoa应用的平台。GNUstep项目历史悠久,最初旨在为Linux和其他Unix机器提供桌面应用编程环境,其开发库基于OpenStep API,这是一个发布的标准,包含的类和API是当今Foundation和AppKit框架的子集。GNUstep一直在发展,志愿者们不断重新实现苹果添加到Mac OS X的新功能,但它的主要目标仍然是实现旧的OpenStep API。如果想将Cocoa应用移植到其他Unix变体或Windows上,GNUstep值得考虑。
Cocotron是几年前出现的新选择,它更关注跟上苹果的最新类和API变化,主要部署目标是Windows。而且,它的许可证限制较少,开发者可以将其集成到自己的闭源应用中。更多关于GNUstep的信息可访问www.gnustep.org ,关于Cocotron的信息可访问www.cocotron.org 。
Cappuccino/Objective - J
Cappuccino开发环境是近年来的一个有趣发展。它专注于创建Web应用,包含模仿Foundation和AppKit的类库,并在JavaScript中实现了很多Objective - C的语法,这种在JavaScript中实现Objective - C的方式称为Objective - J。使用Cappuccino创建的应用可以发布在任何Web服务器上,并在现代浏览器中运行。
背后的公司280 North正在开发一个名为Atlas的工具,用于管理Objective - J源代码和定义Cappuccino应用的GUI,类似于Xcode和Interface Builder。目前,Cappuccino技术仍处于起步阶段,Atlas仅提供私有测试版,但前景非常乐观。更多信息可访问http://280north.com 。
总之,Cocoa开发领域不断发展,有许多新兴的技术和方法等待我们去探索和应用。无论是使用不同的语言进行开发,还是将Cocoa技术应用到不同的平台,都为开发者提供了更多的选择和可能性。希望大家能在这些技术中找到适合自己的开发路径,创造出优秀的应用。
Cocoa开发的未来路径探索(续)
各技术对比总结
为了更清晰地了解不同技术在Cocoa开发中的特点,我们将上述提到的各种方式进行对比总结,如下表所示:
| 技术 | 语言 | 特点 | 优点 | 缺点 | 适用场景 |
| — | — | — | — | — | — |
| PyObjC | Python | 为Cocoa中Objective - C类方法提供映射,方法名中冒号用下划线替换,参数放括号内,对象自动桥接 | 可在Python中使用Cocoa类,Leopard和Snow Leopard包含,Xcode有模板 | 代码可读性受影响,不太符合Python风格 | 熟悉Python,想利用Python进行Cocoa开发 |
| MacRuby | Ruby | 摒弃Ruby标准库类,用Cocoa等效类并添加新方法,方法调用接近Objective - C | 提供编译为本地代码特性,采用基于LLVM的新运行时 | 有经验的Ruby开发者可能不适应类和方法变化 | 想在Ruby风格下进行Cocoa开发 |
| Nu | Lisp变体 | 与Objective - C有相似的方法和参数交织语法,含命令行shell和类似make工具 | 可方便进行临时脚本编写,探索Cocoa框架 | 作为新语言,可能需要一定学习成本 | 对Lisp有了解,想尝试新语言与Cocoa交互 |
| JavaScript(WebKit+JSCocoa) | JavaScript | WebKit可构建脚本层,JSCocoa完全桥接JavaScript与Cocoa,语法接近Objective - C | 可利用JavaScript脚本化应用,可编写完整Cocoa应用 | WebKit不能创建完整应用,JSCocoa技术较新 | 熟悉JavaScript,想为应用添加脚本功能或用JavaScript开发Cocoa应用 |
| F - Script | 基于Smalltalk | 可嵌入应用添加用户脚本功能,为开发者提供探索运行中应用的工具 | 方便开发者探索应用对象结构 | 主要用于开发调试辅助,不是主要开发语言 | 开发过程中需要对应用进行调试和探索 |
| Cocoa Touch | Objective - C | Foundation框架类似,AppKit被UIKit取代,适应触摸屏设备 | 针对移动设备优化,有新特性 | 有垃圾回收、绑定、块等技术限制 | iPhone应用开发 |
| GNUstep | 多种(适配不同平台) | 基于OpenStep API,为Unix和Windows提供类Cocoa环境 | 可将Cocoa应用移植到不同平台 | 主要目标是旧API,新功能更新慢 | 将Cocoa应用移植到Unix或Windows |
| Cocotron | 多种(适配不同平台) | 关注苹果最新类和API变化,主要部署目标是Windows,许可证限制少 | 能跟上苹果更新,可用于闭源应用 | 相对较新,可能存在稳定性问题 | 将Cocoa应用移植到Windows |
| Cappuccino/Objective - J | JavaScript | 在JavaScript中实现Objective - C语法,用于创建Web应用 | 可创建在浏览器运行的Web应用,有工具辅助开发 | 技术处于起步阶段 | 创建跨平台的Web应用 |
开发流程示例
下面以使用MacRuby开发一个简单的Cocoa应用为例,展示开发的基本流程:
1.
环境准备
:
- 确保已经安装了MacRuby开发环境。可以从http://www.macruby.org 下载并安装。
2.
创建项目
:
- 打开终端,使用以下命令创建一个新的MacRuby项目目录:
mkdir MyMacRubyApp
cd MyMacRubyApp
-
编写代码
:
-
创建一个Ruby文件,例如
app.rb,编写一个简单的通知示例代码:
-
创建一个Ruby文件,例如
require 'Cocoa'
class MyNotifier
def send_notification
center = NSNotificationCenter.defaultCenter
center.postNotificationName('DATA_RECEIVED', object:self)
end
end
class MyObserver
def initialize
center = NSNotificationCenter.defaultCenter
center.addObserverForName('DATA_RECEIVED', object:nil, queue:nil) do |notification|
puts "Received notification: #{notification}"
end
end
end
notifier = MyNotifier.new
observer = MyObserver.new
notifier.send_notification
-
运行代码
:
- 在终端中运行以下命令来执行代码:
macruby app.rb
未来展望
随着技术的不断发展,Cocoa开发领域也将持续演变。以下是一些可能的发展趋势:
1.
更多语言支持
:可能会有更多的编程语言与Cocoa进行桥接,为开发者提供更多的选择。例如,一些新兴的脚本语言可能会加入到这个行列中。
2.
技术移植
:苹果有可能将一些目前在Mac上的先进技术(如块、垃圾回收、Cocoa Bindings等)移植到iPhone等移动设备上,进一步统一开发体验。
3.
Web与桌面融合
:像Cappuccino这样的技术可能会不断发展,使得Web应用和桌面应用的界限更加模糊,开发者可以使用相同的技术栈开发出跨平台、跨设备的应用。
4.
性能优化
:随着硬件性能的提升和开发工具的不断改进,Cocoa应用的性能将得到进一步优化,无论是在桌面端还是移动端。
以下是一个简单的mermaid流程图,展示了Cocoa开发中选择不同技术的大致流程:
graph LR
A[开始开发Cocoa应用] --> B{选择开发语言}
B --> |Objective - C| C[传统Cocoa开发]
B --> |Python| D[PyObjC开发]
B --> |Ruby| E[MacRuby开发]
B --> |Lisp变体| F[Nu开发]
B --> |JavaScript| G[WebKit+JSCocoa开发]
B --> |其他需求(调试等)| H[F - Script辅助]
C --> I[开发桌面或移动应用]
D --> I
E --> I
F --> I
G --> J[开发Web应用或添加脚本层]
H --> K[调试和探索应用]
总之,Cocoa开发的未来充满了机遇和挑战。开发者可以根据自己的需求和技能,选择合适的技术和工具,不断探索和创新,开发出更加优秀的应用。无论是在传统的桌面应用开发,还是在新兴的移动和Web应用领域,Cocoa技术都将发挥重要的作用。
超级会员免费看
8

被折叠的 条评论
为什么被折叠?



