作为一个有抱负的Apple开发人员,如果在进入Objective-C并最终进入Cocoa框架之前先学习C更好,我想获得社区的意见吗?
我的直觉说学习C,这将给我一个良好的基础.
我会先学习C语言.在转到Obj-C之前,我学习了C(在C中做了很多).我有很多同事从来都不是真正的C程序员,他们从Obj-C开始,只学习了必要的C语言.
我不时地看到它们如何在Obj-C中完全解决问题,有时会导致一个非常笨拙的解决方案.通常我会用纯C代码替换一些Obj-C代码(毕竟你可以根据需要混合它们,Obj-C方法的内容可以完全是纯C代码).没有任何意图侮辱任何对象-程序员,也有解决方案,特别文雅的OBJ-C,这些解决方案只是工作(并期待),以好了很多感谢的对象(OOP编程可以使复杂的程序比函数式编程更可爱;例如多态性是一个很棒的特性)......我真的很喜欢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或者只知道它的基础知识并且从未尝试过如何优雅地解决一些常见问题,那么您实际上只学习了一半的Obj-C.C是Obj-C的基本部分.在任何时间和任何地方使用C的能力是它的基本特征.
一个典型的例子是我们使用的一些代码必须在base64中编码数据,但我们不能使用外部库(没有OpenSSL lib).我们使用了base64编码器,完全使用Cocoa类编写.它工作正常,但是当我们编码200 MB的二进制数据时,它花了一个永恒的时间并且内存开销是不可接受的.我用一个微小的,超紧凑的base64编码器替换它,完全作为一个C函数编写(我将函数体复制到方法体中,方法将NSData作为输入并返回NSString作为输出,但在函数内部一切都是C).C编码器非常紧凑,它在速度上超过纯Cocoa编码器8倍,内存开销也小得多.编码/解码数据,玩位和类似的低级任务只是C的优点.
另一个例子是一些UI代码,它绘制了很多图表.为了存储绘制图形所需的数据,我们使用了NSArray.实际上是NSMutableArray,因为图形是动画的.结果:非常慢的图形动画.我们将所有NSArray替换为普通的C数组,带有结构的对象(毕竟图形坐标信息在对象中没有任何东西),枚举器访问简单的for循环,并开始使用memcopy在数组之间移动数据,而不是从一个数组中获取数据另一个,指数索引.结果:加速因子4.图表平滑动画,即使在较旧的PPC系统上也是如此.
C的弱点是,从长远来看,每个更复杂的程序都会变得丑陋.保持C应用程序的可读性,可扩展性和可管理性需要程序员的许多纪律.许多项目失败了,因为缺少这门学科.Obj-C使您可以使用类,继承,协议等轻松构建应用程序.也就是说,除非必要,否则我不会在方法的边界使用纯C功能.我更喜欢将所有代码保存在对象方法中的Objective-C应用程序中; 其他一切都违背了OO申请的目的.然而,在该方法中,我有时仅使用纯C.
你可以很容易地同时学习C和Objective-C--在开始使用Objective-C添加到语言之前,当然不需要学习C的细节(包括指针算法等),并且作为一个新手程序员快速开始使用Objective-C可以帮助您更快地开始"思考对象".
就可用资源而言,Apple的文档通常假设熟悉C,因此从Objective-C 2.0编程语言开始对您没有多大好处.我会投资一份由Stephen Kochan编写的Objective-C编程副本(取决于你想要多快开始,你可以考虑等待第二版):
编程Objective-C开发人员库 编程Objective-C 2.0开发人员库
它假设没有任何经验,并教你Objective-C和你需要的C.
如果你有点野心勃勃,你可以从Scott Stevenson的"学习C"教程开始,但它确实有一些先决条件("你应该已经知道至少一种脚本或编程语言,包括函数,变量和循环.你' ll还需要在Mac OS X终端中键入命令.").
(只是为了记录和背景:我在同一时间了解到这两个早在1991年-它似乎没有做伤害我,我没有,不过,有一个.背景在BASIC,Pascal中,标志和LISP. )
在写我的关于Objective-C的书之前,我对这个问题有很多想法.首先,我真的相信在学习Objective-C之前学习C语言是错误的.C是一种过程语言,包含许多在Objective-C中编程不必要的特性,特别是在新手级别.事实上,采用这些功能中的某些功能与坚持面向对象的编程方法很好.在学习面向对象的语言之前,教授过程语言的所有细节(并用函数和结构化编程技术攻击问题的解决方案)也不是一个好主意.这可能会使程序员以错误的方向启动,从而可能导致开发错误的方向和思维方式,从而培养出良好的面向对象编程规则.仅仅因为Objective-C是C语言的扩展并不意味着你必须首先学习C语言!
我认为将Objective-C和基础C语言作为单一的集成语言进行教学是正确的方法.没有理由得知"for"语句来自C语言,而不是来自其超集Objective-C语言.此外,为什么在学习数组(NSArray)和字符串对象(NSString)之前,要详细了解C数组和字符串(以及操作它们)之类的内容?许多C文本将大量时间用于结构,指向结构,并使用指针迭代数组.但是你可以在不知道任何这些C语言特性的情况下开始编写Objective-C程序.对于一个新手程序员来说,这是一个大问题.这不仅缩短了学习曲线,而且还减少了必须学习的材料(有些被选择性地过滤掉)以编写Objective-C程序.
我同意你会想要学习大部分(如果不是全部)底层C特性,但是很多内容可以推迟到定义类和方法,处理对象和消息表达式,理解继承和多态性是很容易理解的.
我会直接使用Objective C - 如果你已经掌握了几种语言,那就不是学习曲线的语法,而是Cocoa.
我认为,在大多数情况下,学习C是一个好主意,无论你要进入什么领域,至少要在使用预先包装的商品之前掌握软件开发的内部工作原理,这样如果出现问题你有更好的机会了解内部运作.关于SO的讨论很多,这是一个相当主观的问题,但一般来说,你会在Objective-C代码中使用C,所以我想这完全取决于你.我是一个善良的人,但有时候它可能会阻碍我,我知道几个聪明的人从上到下工作,我认为重要的是你要理解内部工作,因为它会将您的能力与那些不能提高您的能力的人区分开来.
在学习Objective-C之前学习C是个好主意,Objective-C是C的严格超集.这意味着Objective-C可以支持所有正常的C代码,因此C程序通用的代码必然会出现在Objective-中C代码.
除了从语言角度看待事物之外,你会发现Mac OS X是一个完整的Unix操作系统.所有系统级库都用C语言编写.
可能同时学习两者,但我认为如果你对C有扎实的工作知识,你会更加欣赏和理解Objective-C.
我会学习Objective-C并随着你的需要学习尽可能多的C语言.
你不会依赖的C领域:
指针算术和数组.我根本没有使用过C数组.
C字符串.Objective-C的字符串使工作更好,更安全.
如果在Obj-C 2.1中使用GC,则进行手动内存管理.出于开发速度和性能原因,我强烈推荐这条路线.
当您学习Objective-C和Cocoa时,您无法避免学习C的位.例如,矩形通常由C结构(C结构)表示.
如果你有时间,一定要学习C.正如其他人在这里所说的那样,Kochan的书(第二版和第一版)非常适合作为一本书.