iphone - +initialize/+load 应该始终以 : if (self == [MyClass class]) guard? 开头

标签 iphone objective-c cocoa macos

在您的某个 Objective-C 类中实现 +initialize 或 +load 方法时,您是否应该总是从这种守卫开始?:

@implementation MyClass

+ (void)initialize {
    if (self == [MyClass class]) {
        ...
    }
}

...
@end

似乎+load 和+initialize 中的代码通常只想执行一次。因此,这将有助于避免在子类加载/初始化时重复执行。

我想我只是想从一些 ObjC 向导那里得到一些加强,这是必要的/常见的做法......

这方面的常识是什么?你会建议总是这样做吗?

您对 +load 和 +initialize 的建议是否相同,或者它们的处理方式是否有所不同?

谢谢。

最佳答案

快速的回答是:不。

in-depth discussion of this matter可以在 Apple 开发人员邮件列表中找到。

它的要点是:

  1. 运行时实际上会在父类(super class)上调用+initialize它被子类调用之前。
  2. 如果您确实包含守卫,您的类的子类拥有自己的+initialize 方法将不会触发相关的KVO 通知。

有关第 2 点的示例,请务必阅读 this post在上面提到的线程中。

关于iphone - +initialize/+load 应该始终以 : if (self == [MyClass class]) guard? 开头,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/324666/

相关文章:

ios - Xcode 不显示配置文件列表

iphone - iOS 7、UITableView 和不正确的分隔线

ios - 从 iOS SDK 获取 iPhone 联系人时出现问题

ios 音频队列 - 如何测量缓冲区中的音频电平?

objective-c - 隐藏在 Lion 中的滚动条。如果人们不使用触控板,他们如何水平滚动?

ios - 在 CoreData 中存储 NSMutableAttributedString 的简单方法

objective-c - UIImageView 以编程方式调整方向更改为横向模式

cocoa - 像这样的 UI 控件的预制 Cocoa 组件? (圆角矩形显示一堆项目)

iphone - 线程正在退出我的应用程序

macos - 如何从 OSX 中的自定义工作表获取信息