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

我的直觉说学习C,这将给我一个良好的基础.

推荐答案

我会先学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++语法,有些语言特性是简单的过度使用,导致了不良的开发模式IMHO);然而,当我有时重新编写同事的Obj-C代码时(我真的只有在我认为这是绝对必要的情况下才这么做),生成的代码通常要小50%,只需要以前使用的25%的内存,在运行时大约要快400%.

我想说的是:每种语言都有其优缺点.C有优点和缺点,Obj-C也是.然而,Obj-C真正伟大的特性(这就是为什么我甚至比Java更喜欢它)是,你可以随意跳转到普通C,然后再跳回来.为什么这是一个伟大的功能?因为就像Obj-C修复了纯C的许多缺点一样,纯C可以修复Obj-C的一些缺点.如果你把它们混合在一起,你会得到一个非常强大的团队.

如果你只学习Obj-C而对C一无所知,或者只知道它的基本知识,而没有try 过它能多么优雅地解决一些常见的问题,那么你实际上只学会了Obj-C的一半.C是Obj-C的基本组成部分.随时随地使用C的能力是它的一个基本特性.

一个典型的例子是,我们使用的一些代码必须在base64中编码数据,但我们不能使用外部库(没有OpenSSL库).我们使用了base64编码器,完全使用Cocoa类编写.它工作正常,但当我们让它编码200 MB的二进制数据时,它花费了很长时间,而且内存开销是不可接受的.我用一个小巧、超紧凑的base64编码器代替了它,它完全是作为一个C函数编写的(我将函数体复制到方法体中,方法将NSData作为输入,并将NSString作为输出,但函数中的一切都是C).C编码器非常紧凑,速度比纯Cocoa编码器快了8倍,内存开销也少得多.编码/解码数据、摆弄比特和类似的低级任务正是C语言的优点.

另一个例子是一些绘制了大量图形的UI代码.为了存储绘制图形所需的数据,我们使用了NSArray的.实际上是NSMutableArray的,因为图形是动画的.结果:非常慢的图形动画.我们用普通的C数组替换了所有NSArray,用 struct 替换了对象(毕竟对象中不需要图形坐标信息),用简单的for循环替换了枚举器访问,并开始用memcopy在数组之间移动数据,而不是将数据从一个数组移到另一个数组,以索引为索引.结果是:速度提高了4倍.即使在较旧的PPC系统上,图形的动画也很流畅.

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

C++相关问答推荐

如何在不修改字符串缓冲区早期使用的情况下覆盖字符串缓冲区

InetPton()函数无效的IP地址

字符串令牌化xpath表达式

手动矢量化性能差异较大

将指针作为参数传递给函数

在c++中使用堆栈的有效括号

为什么net/if.h在ifaddrs.h之前?

C lang:当我try 将3个或更多元素写入数组时,出现总线错误

在句子中转换单词的问题

等同于铁 rust 的纯C语言S未实现!()宏

如何使用唯一数字对整型进行分区

C将数组传递给函数以修改数组

C语言中神秘的(我认为)缓冲区溢出

Zlib:解压缩大文件导致";无效代码长度设置";错误

try 查找带有指针的数组的最小值和最大值

在printf()中用%.*S格式填充长度为0的字符串是否会调用任何UB?如果是,是哪一个?

C程序printf在getchar while循环后不工作

c如何传递对 struct 数组的引用,而不是设置 struct 的副本

变量的指针右对齐,函数的指针左对齐

UEFI 应用程序中的计时器回调仅在 AMI BIOS 中挂起