Answers:
我会先学习C。在转到Obj-C之前,我学习了C(并且在C中做了很多事情)。我有很多同事,他们从来都不是真正的C程序员,他们从Obj-C开始,只学习了必要的C语言。
我时不时地看到他们如何完全在Obj-C中解决问题,有时会导致非常笨拙的解决方案。通常,我然后用纯C代码替换一些Obj-C代码(毕竟,您可以随意混合它们,Obj-C方法的内容可以完全是纯C代码)。没有任何侮辱任何Obj-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库)。我们使用了完全使用Cocoa类编写的base64编码器。一切正常,但是当我们对200 MB的二进制数据进行编码时,它花了很长时间,而且内存开销是不可接受的。我用一个很小的,超紧凑的base64编码器代替了它,该编码器完全作为一个C函数编写(我将函数主体复制到方法主体中,方法将NSData作为输入,并将NSString作为输出,但是在函数内部,所有内容都是C)。C编码器更加紧凑,在速度上比纯Cocoa编码器高8倍,并且内存开销也少得多。编码/解码数据,处理位和类似的低级任务只是C的强项。
另一个示例是一些绘制许多图表的UI代码。为了存储绘制图形所需的数据,我们使用了NSArray。实际上是NSMutableArray,因为该图是动画的。结果:图形动画非常慢。我们将所有NSArray替换为普通的C数组,将对象替换为structs(所有图形坐标信息在对象中都没有了),使用简单的for循环进行枚举器访问,并开始使用memcopy在数组之间移动数据,而不是将数据从一个数组移至另一个,索引换索引。结果:速度提高了4倍。即使在较旧的PPC系统上,图形也可以流畅地动画显示。
C的缺点是,从长远来看,每个更复杂的程序都会变得丑陋。保持C应用程序的可读性,可扩展性和可管理性需要程序员的大量纪律。许多项目失败是因为缺少该学科。Obj-C使您可以轻松使用类,继承,协议等来构造应用程序。也就是说,除非必要,否则我不会在方法的边界上使用纯C功能。我更喜欢将所有代码都保存在Object-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的“ Learn C” Tutorial开始,但是它确实有一些先决条件(“您应该已经至少了解一种脚本或编程语言,包括函数,变量和循环。还需要在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语言。此外,为什么在大约像C数组和字符串的东西(和操纵他们)详细了解之前例如,了解数组(NSArray)和字符串对象(NSString)?许多C文本将大量时间用于结构和结构指针,并使用指针遍历数组。但是您可以开始编写Objective-C程序,而无需了解任何这些C语言功能。对于新手程序员来说,这很重要。这不仅缩短了学习曲线,而且减少了编写Objective-C程序必须学习的材料(其中一些被有选择地过滤掉)。
我确实同意您将要学习大多数(即使不是全部)基础C功能,但是许多功能都可以推迟到扎实地掌握定义类和方法,使用对象和消息表达式以及理解继承和继承的概念为止。多态性是众所周知的。
我会深入学习Objective C-如果您已经掌握了几种语言,那么语法不是学习曲线,而是Cocoa。
我认为,在大多数情况下,无论您打算进入哪个领域,学习C都是一个好主意,至少在使用预包装产品之前要掌握软件开发的内部原理,这样一来,如果出现问题您更有机会了解内部运作方式。关于SO的讨论很多,这是一个相当主观的问题,但是总的来说,您将固有地在Objective-C代码中使用C,所以我认为这完全取决于您。我是个地面直的人,但有时会遇到障碍,而且我认识几个聪明的人,他们自上而下地工作,我认为重要的是您必须了解内部的运作方式将您的能力与那些不擅长的人区分开来,并提高您的能力。
我将学习Objective-C,并根据需要学习尽可能多的C。
您不太依赖C的区域:
您可以直接进入Objective-C,具有以下好处:
至少对我来说,当我对某些特定的应用程序或示例感兴趣时,更容易学习一种新语言,而当我不得不学习与我不完全感兴趣的其他事物时,我会失败。
如果您对低级编程感兴趣,可以随时改进C知识。
更好,我不知道,甚至因为我不熟悉Objective-C而更不知道。
但是C的基础并不是那么难学,它不是一种非常复杂的语言(就语法而言,而不是对母版而言!),因此,这样做不会浪费时间。
就个人而言,我认为学习C总是一个好主意,它可以很好地了解计算机的工作原理。毕竟,大多数语言和系统仍然是用C编写的。然后继续!:-)
PS .:“继续前进”,并不是说“放弃”,而是“学习更多,学到不同”。一旦您了解C,您可能永远也不会放过它:Java使用JNI调用C例程来处理低级内容,Python,Lua等经常使用C代码进行扩展(Lua参考甚至只是假设一些函数的C知识,后面的C函数的薄包装),等等。
根据Wikipedia的介绍,Objective-C是C的严格超集。在这种情况下,我建议您首先学习C。然后,当您学习Objective-C时,将很清楚地添加了哪些部分作为Objective-C的一部分。
取决于许多语言,您已经知道,开始学习Objective-C可能是一个更好的主意。大多数语言的基础基本相同,只是语法不同。在学习Objective-C方面,首先学习C并不会带来太大的改变。
恕我直言,首先应该至少学习一些C知识,尤其是关于指针的知识。如果一个人来自没有指针的语言,那将更加重要。很多人问起类似的代码
NSString *string = [[NSString alloc] init];
string = @"something";
因为他们不知道指针与其指向的对象之间的区别。
当然,在开始使用Objective-C之前,不必学习所有 C语言,但是一些基本的事情是绝对必要的。
哎呀,直接去目标C!
我从ActionScript 3转到了Objective C,并且已经在一家公司实习了!
做你想做的。
如果您事先学习过其他语言,那么在编写正确的语法时总是会感到困惑。我不知道目的,但是对象C使用奇怪(不常见)的语法来调用对象方法。它将其命名为发送消息,是的,因此,它确实是纯面向对象的概念,但是大多数面向对象的语言都将其命名为调用方法,并使用更传统的调用方法语法。垃圾收集也很奇怪,对象C是基于旧式引用计数的。因此,如果您从其他语言切换过来,您将很难接受它。我正在为C / C ++程序员编写一本书《对象C快速迁移指南》,希望可以帮助人们更快地了解所有差异。