在学习Objective-C之前先学习C

作为一个有抱负的苹果开发人员,我希望得到社区的意见,如果在进入Objective-C之前学习C最好,最终还是Cocoa Framework?

我的直觉说学C,这会给我一个很好的基础。

我会先学习C. 在学习C之前,我学习了C(并在C中做了很多)。 我有很多从来不是真正的C程序员的同事,他们从Obj-C开始,只学习C语言。

我偶尔会看到他们如何在Obj-C中完全解决问题,有时会导致非常笨拙的解决scheme。 通常我会用纯C代码代替一些Obj-C代码(毕竟你可以随意混合它们,Obj-C方法的内容可以完全是纯C代码)。 没有任何意图侮辱任何Obj-C程序员,在Obj-C中有一些非常优雅的解决scheme,这些解决scheme仅仅因为对象而工作(而且看上去)好得多(OOP编程可以使复杂的程序更加可爱函数式编程;例如多态性是一个辉煌的function)…我真的很喜欢Obj-C(远远超过C ++!我讨厌C ++语法和一些语言function是纯粹的矫枉过正,并导致不良的发展模式恕我直言); 然而,当我有时重写我的同事的Obj-C代码(我真的只这样做,如果我认为这是绝对必要的话),结果代码通常会减小50%,只需要使用它的25%之前和在运行时间约快400%。

我在这里想说的是:每种语言都有其优点和缺点。 C有利有弊,Obj-C也有。 然而,Obj-C的真正优点(这就是为什么我比Java更喜欢它)的原因是,你可以随意跳转到普通的C语言。 为什么这是一个很棒的function? 因为就像Obj-C修复了很多纯C的缺点一样,纯C可以修复Obj-C的一些缺点。 如果你把他们混合在一起,你会得到一个非常强大的团队。

如果你只学习Obj-C并且不了解C或者只知道它的基础知识,从来没有尝试过如何优雅地解决一些常见问题,那么你实际上只学习了Obj-C的一半。 C是Obj-C的基本部分。 随时随地使用C的能力是其基本特征。

一个典型的例子是我们使用的必须在base64中编码数据的代码,但是我们不能使用外部库(没有OpenSSL库)。 我们使用了一个base64编码器,完全用Cocoa类编写。 它工作正常,但是当我们编码200 MB的二进制数据时,它花了一个永恒,内存开销是不可接受的。 我用一个小巧,超紧凑的base64编码器代替了它,完全是一个C函数(我将函数体复制到方法体中,方法以NSData作为input,并返回NSString作为输出,但函数内部都是C)。 C编码器是非常紧凑的,它以8倍的速度击败纯cocoa编码器,并且内存开销也小得多。 对数据进行编码/解码,在位和类似的低级任务中玩耍,都是C的优点。

另一个例子是一些UI代码画了很多图。 为了存储绘制graphics所需的数据,我们使用NSArray的。 实际上NSMutableArray的,因为图是animation的。 结果:非常慢的graphicsanimation。 我们用正常的C数组取代了所有的NSArray,带有结构的对象(毕竟graphics坐标信息不是你必须拥有的对象),使用简单的for循环访问枚举数,并用memcopy开始在数组之间移动数据,而不是从一个数组中取数据另一个是索引索引。 结果:加速了4倍。即使在旧的PPC系统上,graphics也能stream畅地animation。

C的弱点在于,从长远来看,每一个更复杂的程序都会变得很难看。 保持C应用程序的可读性,可扩展性和可pipe理性需要程序员的许多纪律。 许多项目失败,因为这个纪律缺失。 Obj-C使您可以轻松地使用类,inheritance,协议等来构造您的应用程序。 也就是说,除非必要,否则我不会在方法的边界上使用纯C函数。 我更喜欢把一个Objective-C应用程序中的所有代码保存在一个对象的方法中; 一切都打败了面向对象应用程序的目的。 但是,在这个方法中,我有时只使用纯C语言。

你可以随时学习C和Objective-C,在开始Objective-C的语言之前,肯定不需要学习C的细节(包括指针算术等等),并且作为一个新手程序员快速进行Objective-C可能会帮助您更快地开始“思考对象”。

就可用资源而言,苹果的文档通常假定您熟悉C语言,所以从Objective-C 2.0开始,对您来说不会有什么好处。 我会投资Stephen Kochan编写Objective-C的程序(取决于你想要进行多快,你可能会考虑等待第二版):

编程Objective-C开发人员库 编程Objective-C 2.0开发人员库

它假定没有以前的经验,并教你Objective-C和尽可能多的C,因为你需要。

如果你觉得有点野心,你可以从Scott Stevenson的“Learn C”教程开始 ,但是它有一些先决条件(“你应该已经知道至less一种脚本或编程语言,包括函数,variables和循环,还需要在Mac OS Xterminal中input命令。“)。

(只是为了logging和背景:我在19​​91年同时学到了这两个东西 – 这对我来说似乎并没有什么坏处,但我确实有BASIC,Pascal,Logo和LISP的背景。 )

在编写Objective-C的书之前,我想了很多关于这个问题。 首先,我相信在学习Objective-C之前学习C语言是错误的。 C是一种过程式语言,它包含许多在Objective-C编程中不需要的特性,特别是在新手级别。 实际上,采取这些function中的一些function违背了坚持一个好的面向对象编程方法的粒度。 在学习面向对象的知识之前,教授程序语言的所有细节(并用function和结构化编程技术攻击问题的解决scheme)也不是一个好主意。 这可能导致程序员错误的方向,可能导致培养出一个良好的面向对象编程学科的错误方向和思维方式。 仅仅因为Objective-C是C语言的扩展,并不意味着你必须先学习C语言!

我认为把Objective-C和底层C语言作为一个单一的综合语言进行教学是正确的。 没有理由知道“for”语句来自C语言,而不是来自其超集Objective-C语言。 另外,为什么要在学习数组(NSArray)和string对象(NSString) 之前详细学习像C数组和string(以及操作它们)的内容? 许多C文本花费了大量的时间来构造结构,指向结构,并用指针迭代数组。 但是你可以开始编写Objective-C程序而不需要了解这些C语言特性。 而对于新手程序员来说,这是一个大问题。 这不仅缩短了学习曲线,而且还减less了必须学习的材料(有些select性地过滤掉)编写Objective-C程序的数量。

我也同意你会想要学习大部分C语言的基本特征,但是很多都可以推迟到定义类和方法,使用对象和消息expression式以及理解inheritance和多态性是很好理解的。

如果你已经掌握了几种语言,那就不是学习曲线的语法,而是Cocoa。

我认为,大多数情况下,学习C是一个好主意,不pipe你要进入哪个领域,至less在使用预先包装的商品之前弄清楚软件开发的内部运作方式,如果出现问题你有更好的理解内部运作的机会。 这里有很多关于这个的讨论,这是一个相当主观的问题,但是一般来说,你将在你的Objective-C代码中固有地使用C,所以我想这真的取决于你。 我是一个很好的人,但有时候会阻碍我的发展,我知道有几个聪明的人从上到下努力,我认为最重要的是你能理解内在的运作方式设置你的能力与那些不能提高你的能力的人分开。

Objective-C是C的一个严格超集,这意味着Objective-C可以支持所有普通的C代码,所以C程序通用的代码甚至在Objective- C代码。

除了纯粹从语言的angular度来看事物外,你会发现Mac OS X是一个完整的Unix操作系统。 所有的系统级库都用C语言编写

大概可以同时学习,但是如果你有一个C的扎实的工作知识,我认为你会更加欣赏和理解Objective-C。

我会学习Objective-C,随时随地学习C语言。

C你不会太依赖的领域:

  • 指针算术和数组。 我根本没有使用C数组。
  • Cstring。 Objective-C的string可以更好,更安全地工作。
  • 手动内存pipe理,如果您在Obj-C 2.1中使用GC。 我强烈build议这条路线的发展速度和性能的原因。

在你学习Objective-C和Cocoa的时候,你不能避免学习C的一些东西。例如,矩形通常用C结构CGRect表示。

如果你有时间,一定要学会C.正如其他人在这里所说的那样,科坎的书(第二版和第一版)作为一本好书可以深入。

在Objective-C中有很多你不能纯粹做的事情,所以学习一些基本的C技能将是非常重要的。 你至less需要了解variables声明和基本的C库函数,否则你会感到沮丧。

老实说,这么多的语言都是基于C语言的,所以熟悉一下就好了。 无论如何,我要花一两个星期的时间来熟悉C语言。

也就是说,我只是教自己的目标C,而且我必须诚实地说:我没有发现我的C经验像我想象的那样有用。 目标C对我来说绝对是开眼界。

您可以直接跳转到Objective-C,具有以下好处:

  1. 你会学习“一些”的方式。
  2. 您将学习与您相关的C部分。

至less对我来说,当我对某个特定的应用程序或示例感兴趣时,学习一种新的语言会更容易,而当我不得不学习其他我不感兴趣的东西时,就会失败。

如果您对低级编程感兴趣,您可以随时细化您的C知识。

更好的是,我不知道,更不用说我不熟悉Objective-C。
但C语言的基础并不是很难学,它不是一个非常复杂的语言(在语法上,不是在掌握方面!),所以去做吧,不会浪费时间。
就个人而言,我认为学习C总是一个好主意,它能够很好地了解计算机的工作原理。 毕竟,大多数语言和系统仍然用C语言编写,然后继续前进! 🙂

PS:通过“继续前进”,我不是指“放弃”,只是“学习更多,学习不同”。 一旦你认识C,你可能永远不会放弃它:Java使用JNI来调用低级别的C例程,Python,Lua等常常用C代码扩展(Lua引用甚至仅仅假设一些C函数一个薄包装到C函数的后面)等等。

是的,在任何其他高级语言之前学习C语言将帮助您学习其他语言。

根据维基百科的说法,Objective-C是C的一个严格的超集。在这种情况下,我首先build议学习C语言。 那么当你学习Objective-C时,将会清楚哪些部分被添加为Objective-C的一部分。

C给你很less的汇编抽象。 一些C编译器甚至会让你内联汇编。 这对于思考计算机如何工作非常有用,这是非常重要的。

这就是说,如果你真的对Object-C感兴趣,不要让自己被困在C语言中,只是因为它“对你有用”。 当你尝试学习新的技能时,你不需要挫败自己。 你在做什么很有意思,这很重要。

你想成为一名核心开发人员吗? 然后先学习c。

你需要完全掌握c的书籍是技术上最好的作品。 这是你需要的:

C编程语言

标准C库

目标C与C有很大的不同,因此不宜首先学习C。

从语法/语言家庭的angular度来看,学习SmallTalk(基于C的目标)

从实践的angular度来看,要集中精力一次学习一种语言。

后来,如果你想学习另一种语言,C ++,Java和Python是一个简单易学的例子。2)受欢迎,因此是可销售的。3)function强大。

在启动Objective_C之前,您应该具备C的基本知识,但是不需要掌握C的每个细节。

在阅读“Objective-C编程”之后,我已经发表了我的笔记,以帮助别人。

用编程学习客观的C语言 –

根据许多语言,你已经知道,开始学习Objective-C可能是一个更好的主意。 大多数语言的基础是基本相同的,它的语法是不同的。 首先学习C在学习Objective-C方面并没有太大的区别。

我直接学了Objective-C,现在工作了一年左右,当我下载项目来看它们是如何工作的时候,我只是有些困难的阅读C代码,但是现在我真的觉得有必要学习C语言。你可以尝试学习没有C的ObjC,但迟早,你会需要C.

恕我直言,人们应该首先学习至less一些C,特别是关于指针。 如果来自没有指针的语言,那就更加重要了。 很多人都会问这样的代码

NSString *string = [[NSString alloc] init]; string = @"something"; 

因为他们不知道指针和它指向的对象之间的区别。

当然,在Objective-C开始之前,不需要学习所有的C语言,但是一些基本的东西是绝对必要的。

哎呀不,直奔目标C!

我从ActionScript 3移到Objective C,我已经在一家公司实习了!

做你想做的事。

如果你以前学过其他的语言,那么在编写正确的语法时你总是会感到困惑。 我不知道目的,但对象C调用对象方法使用奇怪(不常见)的语法。 它将其命名为发送消息,是的,它相应地是纯粹的面向对象的概念,然而大多数面向对象的语言将其命名为调用方法并使用更传统的调用方法。 垃圾收集也是非常奇怪的,对象C是基于旧学校的参考计数。 因此,如果您从其他语言切换,您将难以接受它。 我正在为C / C ++程序员写一本“Object C快速迁移指南”,希望能够帮助人们更快地吸收所有的差异。