c - 先学C再学Objective-C

就目前而言,这个问题不适合我们的问答形式。我们希望答案得到事实、引用或专业知识的支持,但这个问题可能会引起辩论、争论、投票或扩展讨论。如果您觉得这个问题可以改进并可能重新打开,visit the help center为指导。




9年前关闭。




作为一名有抱负的 Apple 开发人员,我想获得社区的意见,如果在进入 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 中有一些非常优雅的解决方案,这些解决方案由于对象的存在而工作(和看起来)好多了(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 的二进制数据时,它需要一个永恒的时间并且内存开销是 Not Acceptable 。我用一个完全写成一个 C 函数的微型、超紧凑的 base64 编码器替换了它(我将函数体复制到方法体中,方法将 NSData 作为输入并返回 NSString 作为输出,但是在函数内部,一切都是 C)。 C 编码器要紧凑得多,它的速度比纯 Cocoa 编码器高 8 倍,而且内存开销也少得多。编码/解码数据、处理位和类似的低级任务只是 C 的强项。

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

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

https://stackoverflow.com/questions/180549/

相关文章:

ios - 如何以编程方式检查 iOS 应用程序中是否存在键盘?

objective-c - 从当前日期减去 7 天

objective-c - Objective-C 中 `oneway void` 的用例?

ios - 添加一个简单的 UIAlertView

objective-c - 如何将 NSTimeInterval(秒)转换为分钟

ios - 检测到约束模糊地表明高度为零的情况

iphone - 代码设计错误 : Certificate identity appearing t

ios - 如果没有 Table View 结果,在屏幕上显示 "No Results"

ios - 从 iPhone 上的 NSString 中删除 HTML 标签

objective-c - 在 Objective-C 中向 nil 发送消息