gpt4 book ai didi

objective-c - 充分利用 Objective-C 的动态特性

转载 作者:太空狗 更新时间:2023-10-30 03:21:39 26 4
gpt4 key购买 nike

我使用 Objective-C 已经有一段时间了,但是来自静态类型背景 (C#),我认为我正在以一种非常静态的方式使用它。将对象声明为 id 对我来说感觉很陌生,我看不出有什么好处。谁能给我一盏灯,让我更好地理解这一点?

最佳答案

Objective-C 是一种混合语言,您可以在其中随心所欲地动态和静态。如果需要,您可以声明所有变量的所有类型,甚至可以将委托(delegate)变量声明为 NSObject *。 id 类型不像真实类型那样工作,更像是对编译器的提示 告诉他“嘿,我知道我在做什么,相信我”,让编译器避免使用任何类型检查该特定变量。

Objective-C 类型系统的第一个明显好处是容器类型(NSArray、NSDictionary、NSSet)接受并返回 id 类型。这完全消除了对模板和泛型的需要(如在 C++、Java 和 C# 中)。

更好的是,您实际上可以在容器中放置任何类型的元素。只要你知道里面是什么,如果你在同一个 NSArray 中添加两个 NSStrings,一个 NSNumber 和一个 NSValue,没有人会提示。你可以用其他语言做到这一点,但你必须使用“对象”基类或 void* 类型,然后你需要装箱和拆箱(或向上和向下转换)变量以获得相同的行为。在 Objective-C 中,您只需分配即可,这会消除转换运算符和装箱操作产生的噪音。然后您可以向每个对象询问“respondsToSelector:”或“类”,以便在运行时了解身份和您可以对它们执行的操作。在 Objective-C 中,反射是一等公民。

另一个好处是减少了编译时间; Objective-C 程序的编译通常比 C++ 中的等效程序快得多,因为没有执行那么多类型检查,并且在运行时完成了很多链接。编译器更信任程序员。

最后,Objective-C 的动态类型系统使得像 Interface Builder 这样的工具成为可能。这是 Cocoa 和 Cocoa Touch 开发速度更快的主要原因; GUI 可以在任何地方生成带有“id”类型的代码,并且只要 NIB 加载到内存中就会反序列化。就 UI 设计体验而言,唯一接近 Objective-C 的语言是 C#(当然还有 VB.NET),但代价是应用程序要重得多。

我个人更喜欢使用更静态的类型检查,我什至在 Objective-C 编译器中打开“将警告视为错误”设置;我写了一篇关于它的博文:

http://akosma.com/2009/07/16/objective-c-compiler-warnings/

这在您与刚接触该语言的开发人员合作时特别有用。它使编译器比平时更频繁地提示 :)

静态类型系统专家可能不同意所有这些观点,认为静态类型检查允许“智能感知”IDE 和更好的一般维护。我使用 .NET 工作多年(2001 年 - 2006 年),我必须说动态语言倾向于生成更少的代码,更易于阅读,并且通常提供更多的工作自由度。权衡(总是有权衡)是编译时的信息较少。但正如我倾向于说的那样,编译器是一套穷人的测试。恕我直言,最好的事情是拥有一套好的测试,以及一群优秀的测试人员来折磨你的代码以寻找错误,无论您选择哪种语言。

关于objective-c - 充分利用 Objective-C 的动态特性,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1998858/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com