Cocoa Touch/iOS自动调用任何名为'load'的类静态方法

Luk*_*man 1 cocoa-touch static-methods ios4

我遇到了涉及静态方法的Cocoa Touch/iOS的奇怪行为.如果在任何类中实现静态方法'load',Cocoa Touch/iOS将在应用程序开始执行时自动调用该方法.即使你没有从主执行线程中引用那个类,它仍然会被调用,无论如何.

我已经设法在Xcode 3.2.5上的SDK 4.2和Xcode 4.0.1上的SDK 4.3上编译时以及从iPhone模拟器和iPhone设备上运行时复制行为.

这是复制的方法:

创建一个新类并根据需要为其命名.在接口中声明一个静态方法'load'(任何返回类型):

+ (void)load;
Run Code Online (Sandbox Code Playgroud)

然后实现它:

+ (void)load {
    NSLog(@"What the?");
}
Run Code Online (Sandbox Code Playgroud)

编译(确保新类编译)并运行应用程序(在模拟器或设备上).应用程序启动时,切换到并监视GDB视图.你会看到"什么?" 虽然按逻辑没有其他代码引用类或方法,但在那里回显.

最重要的是,如果您在方法中使用任何自动释放代码,您将收到一个错误,表明该方法甚至在int main()方法之前被调用(存在的所有C应用程序的超级网关).

以下代码:

+ (void)load {
    NSLog(@"Hello %@", [NSString stringWithString:@"World"]);
}
Run Code Online (Sandbox Code Playgroud)

会给你一些看起来像的东西:

2011-04-21 00:41:53.828 AppName[548:707] *** __NSAutoreleaseNoPool(): Object 0x8fe8c of class NSCFString autoreleased with no pool in place - just leaking
2011-04-21 00:41:53.838 AppName[548:707] Hello World
Run Code Online (Sandbox Code Playgroud)

所以问题是,有人知道为什么Cocoa Touch/iOS会调用这种方法吗?方法名称'load'有什么特别之处?最后但并非最不重要的是,这是一个功能还是一个错误

p/s:我发现这种行为时,我实现的静态方法'load'实例化了许多自动释放的对象,我被__NSAutoreleaseNoPool()GDB中的多个警告消息困惑.

Chr*_*ian 5

NSObject有一个+(void)加载方法.以下是文档说的内容:

每当将类或类别添加到Objective-C运行时时调用; 实现此方法以在加载时执行特定于类的行为.

所以这是按预期工作的,并不是一个bug.每个类在添加到运行时时都会调用此方法,这是在任何代码开始执行之前.

来源:NSObject文档