107

作为一名有抱负的 Apple 开发人员,我想获得社区的意见,如果在进入 Objective-C 并最终进入 Cocoa 框架之前先学习 C 会更好吗?

我的直觉说学习 C,这将为我打下良好的基础。

4

23 回答 23

163

我会先学习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,因为图形是动画的。结果:非常慢的图形动画。我们用普通的 C 数组替换了所有 NSArray,用结构替换了对象(毕竟图形坐标信息在对象中没有任何东西),用简单的 for 循环访问枚举器,并开始用 memcopy 在数组之间移动数据,而不是从一个数组中获取数据到另一种,索引索引。结果:速度提高了 4 倍。图表动画流畅,即使在旧的 PPC 系统上也是如此。

C 的弱点在于,从长远来看,每一个更复杂的程序都会变得丑陋。保持 C 应用程序的可读性、可扩展性和可管理性需要程序员的大量纪律。许多项目失败是因为缺少这门学科。Obj-C 使您可以轻松地使用类、继承、协议等来构建应用程序。也就是说,除非必要,否则我不会在方法的边界上使用纯 C 功能。我更喜欢将 Objective-C 应用程序中的所有代码保存在对象的方法中;其他一切都违背了 OO 应用程序的目的。但是,在该方法中,我有时会专门使用纯 C。

于 2008-10-07T23:32:34.340 回答
25

你可以很容易地同时学习 C 和 Objective-C —— 在开始使用 Objective-C 对语言的添加之前,当然没有必要学习 C 的细节(包括指针运算等),并且作为一个新手程序员快速开始使用 Objective-C 可能会帮助您更快地开始“思考对象”。

就可用资源而言,Apple 的文档通常假定您熟悉 C,因此从Objective-C 2.0 编程语言开始对您没有多大好处。我会投资一本 Stephen Kochan 写的 Programming in Objective-C (取决于你想多快开始,你可以考虑等待第二版):

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

它假设没有任何经验,并教你 Objective-C 和你需要的尽可能多的 C。

如果你觉得有点野心,你可以从Scott Stevenson 的“学习 C”教程开始,但它确实有一些先决条件(“你应该已经知道至少一种脚本或编程语言,包括函数、变量和循环。你”还需要在 Mac OS X 终端中键入命令。”)。

(只是为了记录和上下文:我在 1991 年同时学习了这两者——这似乎对我没有任何伤害。不过,我确实有BASIC、Pascal、Logo 和 LISP的背景。 )

于 2008-10-07T23:06:39.227 回答
18

在写关于 Objective-C 的书之前,我对这个问题想了很多。首先,我真的认为在学习 Objective-C 之前学习 C 语言是错误的道路。C是程序包含许多在 Objective-C 中编程不需要的特性的语言,尤其是在新手级别。事实上,诉诸其中一些特性与坚持良好的面向对象编程方法背道而驰。在学习面向对象的语言之前,教授程序语言的所有细节(并使用函数和结构化编程技术解决问题的解决方案)也不是一个好主意。这可能会使程序员朝着错误的方向开始,可能会导致培养错误的方向和思维方式来培养良好的面向对象编程学科。仅仅因为 Objective-C 是 C 语言的扩展并不意味着你必须先学习 C!

我认为将 Objective-C 和底层 C 语言作为单一的集成语言进行教学是正确的方法。没有理由知道“for”语句来自 C 语言,而不是来自其超集 Objective-C 语言。此外,为什么要详细了解诸如 C 数组和字符串(以及操作它们)之类的东西例如,学习数组(NSArray)和字符串对象(NSString)?许多 C 文本将大量时间用于结构和指向结构的指针,以及使用指针遍历数组。但是您可以在不了解任何这些 C 语言特性的情况下开始编写 Objective-C 程序。对于新手程序员来说,这很重要。这不仅缩短了学习曲线,而且减少了编写 Objective-C 程序时必须学习的材料量(其中一些有选择地过滤掉)。

我同意你会想要学习大部分(如果不是全部的话)底层 C 特性,但是很多可以推迟到牢牢掌握定义类和方法、使用对象和消息表达式以及理解继承的概念和多态性是很好理解的。

于 2010-04-11T16:34:28.950 回答
15

我会直接使用Objective C - 如果您已经掌握了几种语言,那么学习曲线不是语法,而是Cocoa。

于 2008-10-07T21:44:32.653 回答
10

我认为,在大多数情况下,无论你进入哪个领域,学习 C 都是一个好主意,至少在使用预包装商品之前了解软件开发的内部工作原理,这样如果出现问题你有更好的机会了解内部运作。在 SO 上有很多关于这个的讨论,这是一个相当主观的问题,但一般来说,你将在你的 Objective-C 代码中固有地使用 C,所以我想这真的取决于你。我是一个脚踏实地的人,但有时它会妨碍我,我认识几个自上而下的聪明人,我认为重要的部分是你要了解内部运作将你的能力与那些没有能力的人区分开来,同时提高你的能力。

于 2008-10-07T21:42:52.253 回答
7

在学习Objective-C之前学习C是个好主意,Objective-C是C的严格超集。这意味着Objective-C可以支持所有正常的C代码,所以C程序通用的代码即使在Objective- C 代码。

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

可能可以同时学习两者,但我认为如果您首先对 C 有扎实的工作知识,您会更加欣赏和理解 Objective-C。

于 2008-10-07T21:50:41.550 回答
5

我会学习Objective-C,并在学习过程中尽可能多地学习C。

您不太依赖的 C 领域:

  • 指针算术和数组。我根本没有使用过 C 数组。
  • C 弦。Objective-C 的字符串做得更好更安全。
  • 如果您在 Obj-C 2.1 中使用 GC,请手动管理内存。出于开发速度和性能的原因,我强烈推荐这条路线。
于 2008-10-07T21:49:06.357 回答
5

当你学习 Objective-C 和 Cocoa 时,你不能避免学习 C 的一些细节。例如,矩形通常由 C 结构 CGRect 表示。

如果您有时间,请务必学习 C。正如其他人在这里所说,Kochan 的书(第二版和第一版)非常适合作为一本书深入了解。

于 2009-03-25T16:04:33.377 回答
4

有很多事情你不能纯粹用 Objective-C 来做,所以学习一些基本的 C 技能将是非常关键的。您至少需要了解变量声明和基本的 C 库函数,否则您会感到沮丧。

于 2008-10-07T21:43:40.863 回答
3

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

PS.:我所说的“继续前进”并不是指“放弃”,只是“学习更多,学习不同”。一旦你了解了 C,你可能永远不会放弃它:Java 使用 JNI 为低级的东西调用 C 例程,Python、Lua 等经常用 C 代码扩展(Lua 参考甚至只是假设一些函数的 C 知识只是后面的 C 函数的薄包装器),依此类推。

于 2008-10-07T21:40:09.043 回答
3

老实说,很多语言都是基于 C 语法的,熟悉它是一件好事。无论如何,我需要一两个星期来熟悉 C。

也就是说,我确实只是自学了 Objective C,而且我必须说实话:我发现我的 C 经验并没有我想象的那么有用。Objective C 绝对让我大开眼界。

于 2008-10-07T21:43:43.547 回答
3

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

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

至少对我来说,当我对某些特定的应用程序或示例感兴趣时,学习一门新语言会更容易,而当我必须学习其他不完全是我感兴趣的东西时,我就会失败。

如果您对较低级别的编程感兴趣,您可以随时完善您的 C 知识。

于 2008-10-07T21:51:31.313 回答
3

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

于 2011-10-24T15:41:04.583 回答
2

根据Wikipedia,Objective-C 是 C 的严格超集。在这种情况下,我建议先学习 C。然后,当您学习 Objective-C 时,将清楚添加了哪些部分作为 Objective-C 的一部分。

于 2008-10-07T21:44:27.710 回答
2

C 为您提供了很少的汇编抽象。一些 C 编译器甚至可以让你内联汇编。这对于思考计算机的工作方式非常有用,了解这一点很重要。

话虽这么说,如果您真的对 Object-C 感兴趣,请不要仅仅因为它“对您有好处”而让自己陷入用 C 编写东西的困境。在尝试学习新技能时,您无需自责。重要的是你对你正在做的事情感到开心。

于 2008-10-07T21:44:55.617 回答
2

你想成为一名铁杆开发者吗?然后先学c。

完全掌握 c 所需的书籍是技术领域的一些最佳著作。这是您需要的:

C 编程语言

标准 C 库

于 2009-03-24T05:52:11.173 回答
2

Objective C 与 C 有很大的不同,因此不值得首先学习 C。

从语法/语言家族的角度来看,学习 SmallTalk (objective C 所基于的)几乎更好

从实际的角度来看,一次集中精力学习一种语言。

后来,如果您想学习另一种语言,C++、Java 和 Python 1) 易于学习 2) 流行并因此有市场 3) 功能强大。

于 2010-01-29T05:27:30.073 回答
2

在开始 Objective_C 之前,你应该对 C 有基本的了解,但没有必要掌握 C 的每一个细节。

我在阅读“Objective-C 编程”后发表了我的笔记,以防它帮助其他人。

通过编程学习目标 c-

于 2010-10-11T16:15:46.497 回答
1

根据您已经知道的许多语言,刚开始学习 Objective-C 可能是一个更好的主意。大多数语言的基础基本相同,只是语法不同。在学习 Objective-C 时,首先学习 C 并不会产生太大的影响。

于 2008-10-07T21:41:03.783 回答
1

我直接学了Objective-C,用了一年左右就很好用了,我下载项目看C代码的时候读C代码有点困难,但现在我真的觉得有必要学习C。你可以试试学习没有 C 的 ObjC,但迟早你会需要 C。

于 2009-11-22T10:03:43.597 回答
1

恕我直言,首先应该至少学习一些 C 语言,尤其是指针。如果一个人来自一种没有指针的语言,那就更重要了。很多人问代码,比如

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

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

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

于 2010-09-09T22:56:59.097 回答
0

哎呀不,直接去目标C!

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

做你想做的。

于 2010-06-08T17:13:14.397 回答
0

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

于 2010-10-11T22:37:56.603 回答