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


107

作为一名有抱负的苹果开发人员,如果要在进入Objective-C并最终进入Cocoa Framework之前先学习C更好,我想征询社区的意见。

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

Answers:


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,因为该图是动画的。结果:图形动画非常慢。我们将所有NSArray替换为普通的C数组,将对象替换为structs(所有图形坐标信息在对象中都没有了),使用简单的for循环进行枚举器访问,并开始使用memcopy在数组之间移动数据,而不是将数据从一个数组移至另一个,索引换索引。结果:速度提高了4倍。即使在较旧的PPC系统上,图形也可以流畅地动画显示。

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


如果我已经了解c ++并想学习iPhone / iTouch开发的Objective-C,那么有必要学习C吗?
chester89,2009年

11
@ chester89:如果您已经了解C ++,那么您将对C有足够的了解,可以开始使用Objective-C。

Sven是对的,C ++非常复杂,已经使用了太多纯C语言,如果您真的很了解C ++,那么您也应该足够了解C。
Mecki 2010年

这是我最喜欢的话题,谢谢。
Morkrom

1
@FrederikWitte不用C ++,它只会使您作为初学者感到困惑(并且它不是移动开发所需的语言)。从Java开始,它是一种很好的教学语言,仅了解Java就足以为Android开发(也许除非您想编写游戏或视频播放器)。然后学习C,最后学习Obj-C,除非您想跳过所有学习Swift的步骤。你的选择。
梅基2015年

25

您可以轻松地同时学习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。 )


2
您绝对不应该认为有必要先学习C。特别是如果您已经知道Java C#之类的语言。C#和Java在很大程度上归功于目标C。尽管C#在很大程度上要归功于Helsbergs在Delphi中的经验和错误。
Daniel Honig

18

在写有关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功能,但是许多功能都可以推迟到扎实地掌握定义类和方法,使用对象和消息表达式以及理解继承和继承的概念为止。多态性是众所周知的。


这一切对于那些想要快速学习而又避免挣扎和深刻理解的人而言。我正在教一个完整的编程新手(虽然我有11年以上的编程经验)进行编程,并且以前曾经教过其他人(但是我没有老师要讲清楚)。知道吗?对于一个完整的初学者来说,我们习惯的所有这些概念都太过复杂和不直观了!C是理解足够低级内容的好方法,因此将来对他们来说不会是什么魔术。就是说,对于一个更好的程序员来说,使用C的野蛮人规则==可以更好地学习曲线
MANIAK_dobrii 2014年

15

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


1
话虽如此,现在有更多的方法可用于学习C。发现这是ObjC的最难的部分,缺乏组织良好,清晰的资料,没有足够的深度可以与C或C ++资料进行比较,并且确实可以帮助您了解在里面继续。
Spanky 2010年

10

我认为,在大多数情况下,无论您打算进入哪个领域,学习C都是一个好主意,至少在使用预包装产品之前要掌握软件开发的内部原理,这样一来,如果出现问题您更有机会了解内部运作方式。关于SO的讨论很多,这是一个相当主观的问题,但是总的来说,您将固有地在Objective-C代码中使用C,所以我认为这完全取决于您。我是个地面直的人,但有时会遇到障碍,而且我认识几个聪明的人,他们自上而下地工作,我认为重要的是您必须了解内部的运作方式将您的能力与那些不擅长的人区分开来,并提高您的能力。


如果您还没有扎实的基础,那么首先学习C可能还会扭曲您对OO编程的看法。混合使用结构化编码和过程编码是不好的。但是,在许多C令人瞩目的地方,例如编写底层代码,OO失去了它的价值。
丹尼尔·洪尼格

1
我建议每个开发人员在某个时候学习C的原因至少是基于这样的想法,即即使OO语言最终也可以编译成与C完全相同的指令。对象的变量使用指针,垃圾收集器使用malloc和free,文件使用OS句柄锁定;当Java或C#应用程序出现问题时,了解这些基础知识可以极大地增进您对错误原因的理解。了解将要执行的资源分配还趋向于导致编写更明智的代码,这些代码将针对特定上下文更优化地执行。
TheXenocide '02

7

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

除了纯粹从语言的角度来看事情之外,您还将发现Mac OS X是完整的Unix操作系统。所有系统级库都用C编写。

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


5

我将学习Objective-C,并根据需要学习尽可能多的C。

您不太依赖C的区域:

  • 指针算术和数组。我根本没有使用过C数组。
  • C字符串。Objective-C的琴弦做得更好,更安全。
  • 如果在Obj-C 2.1中使用GC,则进行手动内存管理。出于开发速度和性能方面的考虑,我强烈建议您使用此路线。

6
一个警告:Objective-C中的垃圾回收并非在所有平台上都可用(尤其是iPhone),这是需要注意的。
Mark Bessey

5

当您学习Objective-C和Cocoa时,就无法避免学习C语言。例如,矩形通常由C结构CGRect表示。

如果您有时间,一定要学习C。正如其他人在这里说的那样,Kochan的书(第二版和第一版)非常适合作为学习的书。


4

在Objective-C中,有很多事情是您无法纯粹完成的,因此学习一些基本的C技能将非常关键。您至少需要了解变量声明和基本的C库函数,否则您将感到沮丧。


3

坦白说,有太多的语言基于C语法,所以熟悉是一件好事。无论如何,我将花一两个星期来熟悉C。

就是说,我只是自学了目标C,我必须老实说:我没有发现我的C经验像我想的那样有用。目标C绝对让我大开眼界。


3

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

  1. 您将通过这种方式学习“一些”C。
  2. 您将学习与您相关的C部分。

至少对我来说,当我对某些特定的应用程序或示例感兴趣时,更容易学习一种新语言,而当我不得不学习与我不完全感兴趣的其他事物时,我会失败。

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


3

更好,我不知道,甚至因为我不熟悉Objective-C而更不知道。
但是C的基础并不是那么难学,它不是一种非常复杂的语言(就语法而言,而不是对母版而言!),因此,这样做不会浪费时间。
就个人而言,我认为学习C总是一个好主意,它可以很好地了解计算机的工作原理。毕竟,大多数语言和系统仍然是用C编写的。然后继续!:-)

PS .:“继续前进”,并不是说“放弃”,而是“学习更多,学到不同”。一旦您了解C,您可能永远也不会放过它:Java使用JNI调用C例程来处理低级内容,Python,Lua等经常使用C代码进行扩展(Lua参考甚至只是假设一些函数的C知识,后面的C函数的薄包装),等等。


3

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


2

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


2

C给您很少的汇编语言抽象。一些C编译器甚至可以让您内联汇编。这对于考虑计算机的工作原理非常有用,这一点很重要。

话虽这么说,如果您真的对Object-C感兴趣,请不要仅仅因为它“对您有好处”就让自己陷入用C语言写东西的麻烦。在尝试学习新技能时,您无需感到沮丧。重要的是您要对自己所做的事情感到开心。


2

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

完全掌握c所需的书是技术方面最好的著作。这是您需要的:

C语言

标准C库


2

目标C与C完全不同,因此不值得首先学习C。

从语法/语言族的角度来看,研究SmallTalk(目标C的基础)几乎要好得多

从实际角度出发,集中精力一次学习一种语言。

后来,如果您想学习另一种语言,C ++,Java和Python就是1)易于学习; 2)很流行,因此适销对路; 3)功能强大。


1
不,Objective-C是C的很小的超集。没有C,您将无法在Objective-C中做任何事情。当然,对象模型是从smalltalk中获取的,但是对于大多数部分来说,语法甚至都不是很紧密。
斯文

2

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

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

通过编程学习目标c


1

取决于许多语言,您已经知道,开始学习Objective-C可能是一个更好的主意。大多数语言的基础基本相同,只是语法不同。在学习Objective-C方面,首先学习C并不会带来太大的改变。


但前提是至少知道另一种其他编程语言。
Sven 2010年

除了
@Sven

1

我立即学习了Objective-C,并且运行了大约一年时间,当我下载项目以了解它们的工作原理时,我只是在阅读C代码时遇到了一些困难,但是现在我真的觉得有必要学习C。您可以尝试学习没有C的ObjC,但迟早需要C。


1

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

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

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

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


我希望我可以投票+10。一次在obj-c开发人员访谈中,有人问我是否可以创建指向NSInteger的指针...我感到震惊,因为这对我来说是如此重要,但似乎并不是每个人都如此。因此,这很重要,容易忘记,这也需要理解。
MANIAK_dobrii 2014年

0

哎呀,直接去目标C!

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

做你想做的。


为什么您会完全错过面向对象的思想状态并首先开始学习C?这就像学习放风筝,并希望成为一名飞行员一样。您必须从一开始就集成OOP。
SwiftArchitect

0

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


因为在Objective-C中,“发送消息”不是“调用方法”,而是同时发送消息会导致调用方法(函数)=)当您将消息发送到对象时,它会通过消息分发机制(您可以在此处阅读:developer.apple.com/library/ios/documentation/Cocoa/Conceptual/…或此处:stackoverflow.com/questions/982116/…
MANIAK_dobrii 2014年
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.