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两者都提供委托/通知挂钩,用于在启动时向应用程序注入一些代码.