这很奇怪。因为我一直在处理我的应用程序,这个问题突然出现,然后它总是神秘地消失了。今天它拒绝消失。
我的应用使用两个视图控制器来处理自动旋转。有时,Objective-C无法找到我的课程。例如[OneViewController alloc]将崩溃。我添加了一个函数来捕获这个状态,即使我在运行一行自己的代码之前调用它,事情仍然会被破坏。我认为无论出现什么问题,我都不会写任何错误的代码。
任何人都知道为什么universalGoodness不会是常数吗?
void verifyUniversalGoodness()
{
id portrait_class, landscape_class;
portrait_class = NSClassFromString(@"OneViewController");
landscape_class = NSClassFromString(@"OtherViewController");
NSLog(@"CHECKING GOODNESS: portrait %@, landscape %@", portrait_class, landscape_class);
if (portrait_class == nil || landscape_class == nil)
exit(0);
}
int main( int argc, char *argv[] )
{
verifyUniversalGoodness();
NSAutoreleasePool * pool = [[NSAutoreleasePool alloc] init];
int retVal = UIApplicationMain(argc, argv, nil, nil);
[pool release];
return retVal;
}
如果我让它运行以调用alloc ...
,这就是堆栈跟踪的样子#1 0x3356296c in _class_initialize ()
#2 0x33567dfe in prepareForMethodLookup ()
#3 0x33565168 in lookUpMethod ()
#4 0x33562914 in _class_lookupMethodAndLoadCache ()
#5 0x3356264a in objc_msgSend_uncached ()
#6 0x000de704 in -[MyAppDelegate finishStartup] (self=0x61c9a0, _cmd=0x303117) at /Users/michael.toy/PROJECT/MyAppDelegate.mm:180
#7 0x32b77904 in __NSFireDelayedPerform ()
#8 0x32c23d22 in CFRunLoopRunSpecific ()
#9 0x32c234e0 in CFRunLoopRunInMode ()
#10 0x30d620da in GSEventRunModal ()
#11 0x30d62186 in GSEventRun ()
#12 0x314d54c8 in -[UIApplication _run] ()
#13 0x314d39f2 in UIApplicationMain ()
#14 0x000e13a8 in main (argc=1, argv=0x2ffff5a8) at /Users/michael.toy/PROJECT/main.mm:38
答案 0 :(得分:1)
感谢您的回复。这让我更加关注这个问题。事实证明,我关心的类在一个库中,而主要在另一个库中,并且这两个库都链接到我的最终二进制文件中。
我需要将-Wl,-ObjC添加到我的链接行,这似乎有固定的东西,现在恢复了universalGoodness。我不知道是什么触发了需要这种状态的状态,但我很高兴能重新开始工作。
答案 1 :(得分:0)
我不知道答案,但我对NSClassFromString()和NSBundle的-(Class)classNamed:(NSString *)className
“由aClassName命名的类对象, 如果没有该名称的类,则为零 目前已加载*。如果aClassName是 nil,返回nil。“
VS
“className的Class对象。 如果className不是1,则返回nil 与...相关的类 接收器或是否有错误 加载包含的可执行代码 类实现。“
所以NSClassFromString()似乎并不意味着实际加载类的命令。
答案 2 :(得分:-1)
portrait_class/landscape_class
应该是Class
对象,而不是id
对象:
typedef struct objc_class *Class;
typedef struct objc_object {
Class isa;
} *id;
(那是来自objc.h)