第十六章:给 C/C++ 老兵的战地手册

16.1 别想了,没有模板 (Templates)

OC 的泛型(Generics)是假的。 NSArray<NSString *> 只是给编译器看的。在运行时,它就是个装满 id 的数组。 所以,别想着用模板元编程。别想着用 SFINAE。 OC 是动态语言,它的多态靠的是 Duck Typing(鸭子类型)和 Runtime 查找,而不是编译期生成代码。

16.2 智能指针 vs ARC

C++ 11 有 std::shared_ptr。 OC 有 ARC (Automatic Reference Counting)。 它们在原理上几乎一样:引用计数。

但是 OC 的对象统一继承自 NSObject,系统级别内置了计数器。

  • std::shared_ptr -> strong property
  • std::weak_ptr -> weak property (而且 OC 的 weak 指针指向的对象死后会自动置为 nil,这是最伟大的发明之一,再也不用担心野指针了)。

16.3 名字空间?不存在的

C++: namespace MyLib { ... } OC: (没有)

所以你会看到:NSObject, UIView, AFNetworking。 前缀(Prefix)就是我们的名字空间。 如果你写一个库,请务必加上你的前缀(比如 AGPerson),否则你会和别人的 AGPerson 冲突,然后导致 Linker Error。

16.4 拥抱运行时

C++ 的 RTTI (运行时类型识别) 被很多人认为是恶魔。 但在 OC 里,Introspection (内省) 是日常。 isMemberOfClass:, isKindOfClass:, respondsToSelector:。 尽情地问对象它是什么吧。

使用 Hugo 构建
主题 StackJimmy 设计