我最近购买了一台Mac电脑,主要用于VMWare Fusion下的C#开发.有了这么多漂亮的Mac应用程序,我开始考虑只需点击一下安装就可以潜藏Xcode,并学习Objective-C.

这两种语言之间的语法看起来非常不同,可能是因为Objective-C源于C,而C#源于Java/C++.但是可以学习不同的语法,这样就可以了.

我主要关心的是如何使用这种语言,以及它是否有助于生成 struct 良好、可读性强且优雅的代码.我真的很喜欢C#中的LINQ和var等功能,不知道Objective-C中是否有等价的或更好的/不同的功能.

What language features will I miss developing with Objective-C? What features will I gain?

Edit:框架比较是有用且有趣的,但language比较才是这个问题真正要问的(部分是我的错,因为最初用.net标记).大概是可可和咖啡.NET本身就是非常丰富的框架,它们都有自己的目的,一个是针对Mac OS X,另一个是针对Windows.

感谢您迄今为止深思熟虑、合理平衡的观点!

推荐答案

没有一种语言适合所有任务,Objective-C也不例外,但有一些非常具体的细节.比如使用LINQvar(我不知道有没有直接替换),其中一些与语言严格相关,另一些与框架相关.

(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会自动为您在一个或多个不同的线程上执行这些块.

Objective-c相关问答推荐

iPhone:将日期字符串转换为相对时间戳

iphone keys 串项目在应用程序卸载后仍然存在?

如何在旋转时定义 CollectionView 的大小

如何使用键值编码判断对象是否存在键?

在objective-c中创建现在的时间戳作为NSNumber

如何在使用 React Native 时实现 SSL 证书固定

[Facebook-iOS-SDK 4.0]如何从FBSDKProfile获取用户邮箱

如何测试生产推送通知?

OSStatus 错误代码 -34018

如何四舍五入浮点值?

属性与实例变量

声音在 iPhone 模拟器中不起作用?

[NSNull null] 和 nil 有什么区别?

iOS6:supportedInterfaceOrientations 不起作用(被调用但界面仍然旋转)

如何在 Objective-C 中创建一个空白的透明 png?

如何在 Objective-C 中将 NSString 解析为 BOOL?

嵌入自定义容器视图控制器时,内容位于导航栏下方.

获取临时目录中文件的文件路径和 URL

如何以编程方式在 UINavigationController 中按下返回按钮

NSMutableArray addObject 不起作用