【问题标题】:Learn C first before learning Objective-C [closed]在学习Objective-C之前先学习C [关闭]
【发布时间】:2010-09-15 21:13:28
【问题描述】:

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

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

【问题讨论】:

    标签: c objective-c cocoa


    【解决方案1】:

    我会先学习 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++ 语法,而且一些语言特性明显矫枉过正并导致坏发展模式恕我直言);然而,当我有时重写同事的 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。

    【讨论】:

    • 如果我已经知道 c++ 并且想学习 Objective-C 以进行 iPhone/iTouch 开发,是否有必要学习 C 任何东西?
    • @chester89:如果您已经了解 C++,那么您对 ​​C 的了解就足以开始使用 Objective-C。
    • Sven 是对的,C++ 这么复杂,已经使用了这么多纯 C,如果你真的很了解 C++,那么你也应该足够了解 C。
    • 这是我最喜欢的话题,谢谢。
    • @FrederikWitte 忽略 C++,它只会让初学者感到困惑(而且它不是移动开发所需的语言)。从 Java 开始,它是一门很好的教学语言,只要了解 Java 就足以为 Android 开发(也许除非你想写游戏或视频播放器之类的东西)。然后学习 C,最后学习 Obj-C,除非你想跳过学习 Swift 的所有内容。您的选择。
    【解决方案2】:

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

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

    Programming Objective-C Developers Library Programming Objective-C 2.0 Developers Library

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

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

    (仅作记录和背景说明:我在 1991 年同时学习了这两种知识——这似乎对我没有任何伤害。不过,我确实有一个背景在 BASIC、Pascal、Logo 和 LISP 中。)

    【讨论】:

    • 你绝对不应该觉得有必要先学习 C。特别是如果您已经了解 Java 的 C# 之类的语言。 C# 和 Java 很大程度上归功于 Objective C。尽管 C# 更多地归功于 Helsberg 在 Delphi 方面的经验和错误。
    【解决方案3】:

    在写关于 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 特性,但许多可以推迟到牢牢掌握定义类和方法、使用对象和消息表达式以及理解概念之后继承和多态性是很好理解的。

    【讨论】:

    • 这一切都是为那些想要快速学习同时避免挣扎和深入理解的人准备的。我正在教一个完整的编程菜鸟(虽然我有 11 年以上的编程经验)来编程并曾经教过别人(但我不是说清楚的老师)。知道什么吗?我们都习惯的所有这些概念对于一个完整的初学者来说太复杂和不直观! C 是理解足够低级别的东西的好方法,因此将来它对他们来说不会是什么魔法。也就是说,为了更好的程序员学习曲线,首先使用 C 的野蛮规则会更好=)
    【解决方案4】:

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

    【讨论】:

    • 话虽如此,还有更多可用于学习 C 的材料。发现这是关于 ObjC 最难的部分,缺乏组织良好、清晰、有足够深度与 C 或 C++ 进行比较的材料材料并真正帮助您了解其中的内容。
    【解决方案5】:

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

    【讨论】:

    • 如果您还没有扎根于 OO 编程,那么首先学习 C 也可能会扭曲您对 OO 编程的看法。混合结构化和程序编码并不好。但也确实,OO 在许多 C 擅长的地方失去了它的价值,例如编写较低级别的代码。
    • 我建议每个开发人员在某个时候学习 C 的原因至少是基于这样的想法,即即使是 OO 语言也可以编译成与 C 最终执行的完全相同的指令。对象的变量使用指针,垃圾收集器使用 malloc 和 free,文件使用 OS 句柄锁定;当 Java 或 C# 应用程序出现问题时,了解这些基础知识可以极大地提高您对问题的理解。了解将要执行的资源分配也往往会导致编写更明智的代码,这些代码将为特定上下文提供更优化的性能。
    【解决方案6】:

    在学习Objective-C之前学习C是个好主意,Objective-C是C的严格超集。这意味着Objective-C可以支持所有正常的C代码,因此C程序通用的代码势必会出现甚至在 Objective-C 代码中。

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

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

    【讨论】:

      【解决方案7】:

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

      您不太依赖的 C 领域:

      • 指针算术和数组。我根本没用过 C 数组。
      • C 字符串。 Objective-C 的字符串做得更好、更安全。
      • 如果您在 Obj-C 2.1 中使用 GC,则需要手动管理内存。出于开发速度和性能的原因,我强烈推荐这条路线。

      【讨论】:

      • 一个警告:Objective-C 中的垃圾收集并非在所有平台(尤其是 iPhone)上都可用,这一点需要注意。
      【解决方案8】:

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

      如果你有时间,一定要学习 C。正如其他人在这里所说,Kochan 的书(第二版和第一版)非常适合作为一本深入研究的书。

      【讨论】:

        【解决方案9】:

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

        【讨论】:

          【解决方案10】:

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

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

          【讨论】:

            【解决方案11】:

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

            1. 您将在途中学习“一些”C。
            2. 您将学习与您相关的 C 部分。

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

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

            【讨论】:

              【解决方案12】:

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

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

              【讨论】:

                【解决方案13】:

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

                【讨论】:

                  【解决方案14】:

                  根据Wikipedia,Objective-C 是 C 的严格超集。既然如此,我建议先学习 C。那么当你学习 Objective-C 时,就会清楚哪些部分是作为 Objective-C 的一部分添加的。

                  【讨论】:

                    【解决方案15】:

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

                    话虽如此,如果您真的对 Object-C 感兴趣,请不要因为 C 语言“对您有好处”而陷入困境。在尝试学习新技能时,您无需自责。重要的是你要从你正在做的事情中获得乐趣。

                    【讨论】:

                      【解决方案16】:

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

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

                      C Programming Language

                      The Standard C Library

                      【讨论】:

                        【解决方案17】:

                        目标 C 与 C 有很大不同,因此不值得先学习 C。

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

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

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

                        【讨论】:

                        • 不,Objective-C 是 C 的非常小的超集。没有 C,您将无法在 Objective-C 中做任何事情。当然,对象模型取自 smalltalk,但大多数部分的语法甚至不接近。
                        【解决方案18】:

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

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

                        learn objective c with programming-

                        【讨论】:

                          【解决方案19】:

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

                          【讨论】:

                          • 但前提是至少了解一种其他编程语言。
                          • 除了@Sven 的评论:“...其中有一些指针的概念”
                          【解决方案20】:

                          我直接学了Objective-C,并且用了大约一年的时间,我只是在下载项目以查看它们是如何工作的时候阅读C代码有些困难,但现在我真的觉得有必要学习C。你可以尝试在没有 C 的情况下学习 ObjC,但迟早你会需要 C。

                          【讨论】:

                            【解决方案21】:

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

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

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

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

                            【讨论】:

                            • 我希望我能投票 +10。有一次在 obj-c 开发人员采访中,有人问我是否可以创建指向 NSInteger 的指针……我很震惊,因为这对我来说非常重要,但似乎并不适合所有人。所以这很重要,也很容易忘记,这也需要理解。
                            【解决方案22】:

                            不,直接去目标C!

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

                            做你想做的。

                            【讨论】:

                            • 你为什么会完全错过面向对象的心态而先开始学习C?这就像学习放风筝并希望成为一名飞行员。您必须从一开始就集成 OOP。
                            【解决方案23】:

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

                            【讨论】:

                            猜你喜欢
                            • 1970-01-01
                            • 1970-01-01
                            • 2011-08-05
                            • 1970-01-01
                            • 1970-01-01
                            • 1970-01-01
                            • 1970-01-01
                            • 1970-01-01
                            • 1970-01-01
                            相关资源
                            最近更新 更多