作为一名有抱负的苹果开发人员,我想了解社区的意见,如果在进入Objective-C并最终进入Cocoa框架之前先学习C语言会更好?
我的直觉说学习C,这将给我一个良好的基础.
作为一名有抱负的苹果开发人员,我想了解社区的意见,如果在进入Objective-C并最终进入Cocoa框架之前先学习C语言会更好?
我的直觉说学习C,这将给我一个良好的基础.
我会先学C.在转到Obj-C之前,我学习了C(并且在C中做了很多).我有很多同事从来都不是真正的C程序员,他们从Obj-C开始,只学习了必要的C.
偶尔我会看到他们是如何完全用Obj-C解决问题的,有时会导致非常笨拙的解决方案.通常我会用纯C代码替换一些Obj-C代码(毕竟你可以随意混合它们,Obj-C方法的内容可以完全是纯C代码).在无意侮辱任何Obj-C程序员的情况下,有一些解决方案在Obj-C中非常优雅,这些解决方案由于objects而工作(并且看起来)更好(OOP编程可以使复杂的程序比函数式编程更可爱;例如多态性是一个出色的功能)...而且我非常喜欢Obj-C(远远超过C++!我讨厌C++语法,有些语言特性是简单的过度使用,导致了不良的开发模式IMHO);然而,当我有时重新编写同事的Obj-C代码时(我真的只有在我认为这是绝对必要的情况下才这么做),生成的代码通常要小50%,只需要以前使用的25%的内存,在运行时大约要快400%.
我想说的是:每种语言都有其优缺点.C有优点和缺点,Obj-C也是.然而,Obj-C真正伟大的特性(这就是为什么我甚至比Java更喜欢它)是,你可以随意跳转到普通C,然后再跳回来.为什么这是一个伟大的功能?因为就像Obj-C修复了纯C的许多缺点一样,纯C可以修复Obj-C的一些缺点.如果你把它们混合在一起,你会得到一个非常强大的团队.
如果你只学习Obj-C而对C一无所知,或者只知道它的基本知识,而没有try 过它能多么优雅地解决一些常见的问题,那么你实际上只学会了Obj-C的一半.C是Obj-C的基本组成部分.随时随地使用C的能力是它的一个基本特性.
一个典型的例子是,我们使用的一些代码必须在base64中编码数据,但我们不能使用外部库(没有OpenSSL库).我们使用了base64编码器,完全使用Cocoa类编写.它工作正常,但当我们让它编码200 MB的二进制数据时,它花费了很长时间,而且内存开销是不可接受的.我用一个小巧、超紧凑的base64编码器代替了它,它完全是作为一个C函数编写的(我将函数体复制到方法体中,方法将NSData作为输入,并将NSString作为输出,但函数中的一切都是C).C编码器非常紧凑,速度比纯Cocoa编码器快了8倍,内存开销也少得多.编码/解码数据、摆弄比特和类似的低级任务正是C语言的优点.
另一个例子是一些绘制了大量图形的UI代码.为了存储绘制图形所需的数据,我们使用了NSArray的.实际上是NSMutableArray的,因为图形是动画的.结果:非常慢的图形动画.我们用普通的C数组替换了所有NSArray,用 struct 替换了对象(毕竟对象中不需要图形坐标信息),用简单的for循环替换了枚举器访问,并开始用memcopy在数组之间移动数据,而不是将数据从一个数组移到另一个数组,以索引为索引.结果是:速度提高了4倍.即使在较旧的PPC系统上,图形的动画也很流畅.
C的弱点是,从长远来看,每一个更复杂的程序都会变得丑陋.保持C应用程序的可读性、可扩展性和可管理性要求程序员有很强的纪律性.许多项目之所以失败,是因为缺少这一纪律.OBJ-C使您可以轻松地使用类、继承、协议等构建应用程序.也就是说,除非必要,否则我不会跨方法边界使用纯C功能.我更喜欢将Objective-C应用程序中的所有代码都保存在对象的方法中;其他一切都违背了OO应用程序的目的.但是,在该方法中,我有时只使用纯C.