Objective-C覆盖[NSObject初始化]是否安全?

Ric*_*III 5 initialization objective-c nsobject

基本上,我有以下代码(在此解释:协议中的Objective-C常量)

// MyProtocol.m
const NSString *MYPROTOCOL_SIZE;
const NSString *MYPROTOCOL_BOUNDS;

@implementation NSObject(initializeConstantVariables)

+(void) initialize {
     if (self == [NSObject class])
     {
         NSString **str = (NSString **)&MYPROTOCOL_SIZE;
         *str = [[MyClass someStringLoadedFromAFile] stringByAppendingString:@"size"];
         str = (NSString **)&MYPROTOCOL_BOUNDS;
         *str = [[MyClass someStringLoadedFromAFile] stringByAppendingString:@"bounds"];
     }
}

@end
Run Code Online (Sandbox Code Playgroud)

我想知道:有一个覆盖NSObject +initialize方法的类别对我来说安全吗?

bbu*_*bum 14

简而言之,不,您无法安全地+initialize在类的类别中实现方法.您最终将替换现有实现(如果有),并且如果两个类都实现+initialize,则无法保证将执行该实现.

+load 具有更多可预测和明确定义的行为,但发生任何有用的事情发生得太早,因为很多事情处于未初始化状态.

就个人而言,我跳过+load+initialize完全使用编译器注释来导致函数在基础二进制文件/ dylib的加载时执行.不过,那时你几乎无法安全地做.

__attribute__((constructor))
static void MySuperEarlyInitialization() {...}
Run Code Online (Sandbox Code Playgroud)

为了响应应用程序的启动,您最好不要进行初始化. NSApplication并且UIApplication两者都提供委托/通知挂钩,用于在启动时向应用程序注入一些代码.

  • 是的 - 它会正常工作.静态库实际上只是一个链接到应用程序的.o文件集合,就像它们首先被编译一样.请注意,在这样的构造函数中不进行初始化是一个更好的长期计划.... (2认同)