objective-c - 为什么 NSRect、NSPoint 等是结构体,而不是类?

标签 objective-c class struct foundation

我最近需要创建自己的类似于 NSRect 的类型,它有一个 anchor (本质上是一个 NSRect 和另一个 NSPoint)。

some 之后research我发现我实际上可能更好地将它设为一个类(如在 NSObject 子类中),而不是使用 struct。那么为什么 Apple 将这些类型设为结构而不是类呢?看起来它会有很多好处,比如不必将它们包装在 NSValues 中,不必使用 C 函数与它们交互等等。

我相信他们会有理由。仅仅是内存使用量稍微减少了吗?只是历史的吗?还是我错过了更重要的事情?

最佳答案

每种编程范式都有自己的优点和缺点,并且 object-oriented programming (OOP) 也不异常(exception)。

拥有类(即以面向对象的风格编写)的所有主要好处是 encapsulation , polymorphisminheritance .

如果我们将诸如 Rect 或 Point 这样的简单单元声明为类,我们将不会使用该列表中的任何内容,但我们会带来 OOP 的所有缺点,包括隐式可变性、更复杂的内存管理、指针引用、隐式参与者、破坏的封装(使用 setter/getter)等。我没有在这里列出数百个 anti-patterns OOP 中确实存在。

我怀疑在 Cocoa 中选择 Rect 和 Point 结构是否符合 C 的传统,首先是因为 Objective-C 从一开始就支持类,其次是因为全新的 Swift语言没有这种传统,但几乎所有标准类型和容器在其标准库中都被声明为结构,而不是类。

一般来说,如果您不需要封装、多态性和继承 - 您应该考虑将您的新实体声明为结构体并尽可能避免 OOP。

关于objective-c - 为什么 NSRect、NSPoint 等是结构体,而不是类?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29467071/

相关文章:

C++ STL 类集 - 编译器错误错误 C2664

c++ - 缺少 C++ 访问器的约定?

c# - 将结构数组从 C# 传递到 C++ DLL

c++ - 在 C++ 中初始化指针数组

objective-c - 在ios中创建对象的最简单方法

objective-c - OCUnit 测试嵌入式框架

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

javascript - 具有相同类的容器具有单独的 jquery 效果

c# - 在 C# 中重用 C 中的结构

iOS AdMob 内存泄漏?