Cocoa touch Cocoa Touch/iOS自动调用名为';加载';

Cocoa touch Cocoa Touch/iOS自动调用名为';加载';,cocoa-touch,ios4,static-methods,Cocoa Touch,Ios4,Static Methods,我遇到了Cocoa-Touch/iOS的一个奇怪行为,涉及到静态方法。如果在任何类中实现静态方法“load”,则当应用程序开始执行时,Cocoa-Touch/iOS将自动调用该方法。即使您没有从主执行线程引用该类,不管发生什么情况,它仍然会首先被调用 在Xcode 3.2.5上的SDK 4.2和Xcode 4.0.1上的SDK 4.3上编译时,以及在iPhone模拟器和iPhone设备上运行时,我成功地复制了这种行为 以下是如何复制: 创建一个新类,并根据需要命名它。在接口中声明静态方法“加载”

我遇到了Cocoa-Touch/iOS的一个奇怪行为,涉及到静态方法。如果在任何类中实现静态方法“load”,则当应用程序开始执行时,Cocoa-Touch/iOS将自动调用该方法。即使您没有从主执行线程引用该类,不管发生什么情况,它仍然会首先被调用

在Xcode 3.2.5上的SDK 4.2和Xcode 4.0.1上的SDK 4.3上编译时,以及在iPhone模拟器和iPhone设备上运行时,我成功地复制了这种行为

以下是如何复制:

创建一个新类,并根据需要命名它。在接口中声明静态方法“加载”(任何返回类型):

然后实施它:

+ (void)load {
    NSLog(@"What the?");
}
编译(确保新类已编译)并运行应用程序(在模拟器或设备上)。当应用程序启动时,切换到并监视GDB视图。您将看到“What the?”在那里回响,即使根据逻辑,没有其他代码引用该类或方法

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

以下代码:

+ (void)load {
    NSLog(@"Hello %@", [NSString stringWithString:@"World"]);
}
将为您提供如下内容:

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
所以问题是,有人知道为什么Cocoa Touch/iOS会调用这种方法吗?方法名“load”有什么特别之处?最后但并非最不重要的一点是,这是一个功能还是一个bug

p/s:我发现了这种行为,当时我实现的静态方法“load”实例化了许多自动释放的对象,我对GDB中的多条警告消息感到困惑。

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

无论何时调用类或类别 添加到Objective-C运行时; 实现此方法以执行 加载时的类特定行为

因此,这是工作的预期,并不是一个错误。当该方法被添加到运行时时(在任何代码开始执行之前),每个类都会调用该方法

来源:

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

无论何时调用类或类别 添加到Objective-C运行时; 实现此方法以执行 加载时的类特定行为

因此,这是工作的预期,并不是一个错误。当该方法被添加到运行时时(在任何代码开始执行之前),每个类都会调用该方法

资料来源:

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