我的直觉告诉我应该先学习 C,这将为我打下良好的基础。
我建议先学习C语言。在开始学习Obj-C之前,我学习了C语言(并且在C语言上做了很多工作)。我有很多同事从未真正成为过C程序员,他们直接从Obj-C开始学习,并只学了必要的C语言知识。
但是,我偶尔会看到他们完全用Obj-C解决问题,有时候结果是非常笨拙的。通常情况下,我会用纯C代码替换一些Obj-C代码(毕竟你可以随意混合它们,Obj-C方法的内容可以完全是纯C代码)。 没有任何侮辱Obj-C程序员的意思,但是有些方案在Obj-C上非常优雅,在面向对象编程中,这些方案比函数式编程更好用;例如,多态性是一个非常出色的功能...而且我真的很喜欢Obj-C(比C++好多了!我讨厌C++的语法,有些语言特性完全是过度的,会导致糟糕的开发模式),然而,当我重新编写同事的Obj-C代码(我只会在我认为绝对必要的情况下这样做),结果的代码通常会缩小50%,只需要使用以前的25%内存并且运行速度更快400%。
我想说的是:每种语言都有其优缺点,C语言和Obj-C也不例外。然而,Obj-C真正伟大的特性(这就是为什么我甚至比Java更喜欢它)是您可以随意跳转到纯C代码再返回来。 为什么这是一个伟大的功能?因为就像Obj-C修复了纯C的许多缺点一样,纯C也可以修复Obj-C的一些缺点。 如果混合使用它们,您将获得非常强大的团队。
如果你只学习Obj-C,并且对C一无所知或者只了解一些基础知识,从未尝试过C语言如何优雅地解决一些常见问题,实际上你只学会了Obj-C的一半。 C语言是Obj-C的基本组成部分。在任何时候和任何地方使用C语言能力是其基本特征。
一个典型的例子是我们使用的一些代码需要将数据编码为base64格式,但我们不能使用外部库来实现这个功能(没有OpenSSL库)。我们使用了一个完全使用Cocoa类编写的base64编码器。它工作得还好,但是当我们让它编码200 MB的二进制数据时,它需要很长时间,而且内存开销不可接受。我用一个非常小的、完全由一个C函数编写的base64编码器代替了它(我将函数体复制到方法体中,方法以NSData为输入并返回NSString作为输出,但是在函数内部,所有内容都是C代码)。这个C编码器非常紧凑,它的速度比纯Cocoa编码器快了8倍,并且内存开销也少得多。编码/解码数据、玩弄位和类似的低级任务正是C的强项。如果你已经掌握了几种语言,我会建议你直接学习Objective-C,因为它的语法并不是最难掌握的部分,相对来说,Cocoa框架才是需要花费更多时间去学习和理解的。
我认为,学习C语言对于无论进入哪个领域都是一个好主意,至少要先掌握软件开发的内部工作原理,然后再使用预打包的产品,这样如果出现问题,你就更有可能理解内部工作原理。关于这个问题,在SO上有很多讨论,而且这是一个相当主观的问题,但总的来说,你将在Objective-C代码中固有地使用C语言,所以我想这真的取决于你自己。我是一个从基础开始的人,但有时候它会妨碍我的发展,我知道一些聪明的人是从上到下逐步发展起来的,我认为重要的是你能够理解内部工作原理,这将使你的能力与那些没有理解原理的人区别开来,并增强你的能力。
我建议你学习Objective-C,并随着学习逐渐掌握所需的C语言知识。
C语言中你不会太依赖的领域:
在学习Objective-C和Cocoa的过程中,你不可避免地需要学习一些C语言。例如,矩形通常由一个C结构体CGRect表示。
如果你有时间,尽管去学习C语言。正如其他人在这里所说的那样,Kochan的书(第二版和第一版)非常适合作为参考书。
在Objective-C中有很多事情是无法完成的,因此学习一些基本的C技能将非常关键。至少需要了解变量声明和基本C库函数,否则您会感到沮丧。