没有一种语言适合所有任务,Objective-C也不例外,但有一些非常具体的细节.比如使用LINQ
和var
(我不知道有没有直接替换),其中一些与语言严格相关,另一些与框架相关.
(NOTE:就像C#与.NET紧密耦合一样,Objective-C与Cocoa紧密耦合.因此,我的一些观点似乎与Objective-C无关,但没有Cocoa的Objective-C与C#没有.NET/WPF/LINQ、在Mono下运行等类似.这不是通常的做法.)
我不会假装详细阐述这些区别、优点和缺点,但这里有一些让我想到的.
Objective-C的一个最好的部分是动态特性——不是调用方法,而是发送消息,运行时会动态路由消息.与动态类型相结合(明智地),这可以使许多强大的模式实现起来更简单,甚至微不足道.
作为C的严格超集,Objective-C相信你知道自己在做什么.与C#和Java等语言的托管和/或类型安全方法不同,Objective-C让你做你想做的事情并体验后果.显然,这有时是危险的,但事实上,这种语言并没有积极地阻止你做大多数事情,这是非常强大的.(EDIT:我应该澄清,C#也有"不安全"的特性和功能,但它们的默认行为是托管代码,您必须显式地 Select 退出.相比之下,Java only允许类型安全代码,并且从未像C和其他语言那样公开原始指针.)
类别(在没有子类或访问源代码的情况下在类上添加/修改方法)是一把可怕的双刃剑.它可以极大地简化继承层次 struct 并消除代码,但如果您做了一些奇怪的事情,结果有时会令人困惑.
Cocoa使创建GUI应用程序在许多方面变得更加简单,但你必须对这个范例保持清醒的头脑.MVC设计在Cocoa中非常普遍,委托、通知和多线程GUI应用程序等模式非常适合Objective-C.
Cocoa绑定和键值观察可以消除大量的粘合代码,Cocoa框架广泛地利用了这一点.Objective-C的动态调度与此密切相关,因此只要对象符合键值,对象的类型就无关紧要.
你可能会错过泛型和名称空间,它们也有它们的好处,但在Objective-C思维模式和范例中,它们将是细节而不是必需品.(泛型都是关于类型安全和避免强制转换的,但Objective-C中的动态类型从本质上讲这不是问题.如果做得好,名称空间会很好,但它足够简单,可以避免成本可能大于好处的冲突,尤其是对于遗留代码.)
对于并发性,块(Snow Leopard中的一个新语言特性,并在大量Cocoa API中实现)非常有用.几行(经常与Grand Central Debug,它是LIB系统10.6的一部分)可以消除回调函数、上下文等的重要样板(块也可以在C和C++中使用,当然可以添加到C,这将是可怕的).NSOperationQueue也是向您自己的代码添加并发性的一种非常方便的方法,它可以分派自定义NSOperation子类或匿名块,GCD会自动为您在一个或多个不同的线程上执行这些块.