0

这是一个奇怪的问题。当我一直在处理我的应用程序时,时不时会出现这个问题,然后它总是神秘地消失了。今天它拒绝消失。

我的应用程序使用两个视图控制器来处理自动旋转。有时,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
4

3 回答 3

1

感谢您的所有回复。它让我更仔细地研究了这个问题。事实证明,我关心的类在一个库中,而主类在另一个库中,并且两个库都链接到我的最终二进制文件中。

我需要将 -Wl,-ObjC 添加到我的链接行,这似乎已经解决了问题,并且现在恢复了 universalGoodness。我不知道是什么触发了需要这样做的状态,但我很高兴能重新开始工作。

于 2010-08-05T03:38:28.490 回答
0

我不知道答案,但我对 NSClassFromString() 和 NSBundle 的不同措辞感到震惊-(Class)classNamed:(NSString *)className

“由 aClassName 命名的类对象,如果当前没有加载该名称的类,则返回 nil*。如果 aClassName 为 nil,则返回 nil。”

对比

“className 的 Class 对象。如果 className 不是与接收器关联的类之一,或者加载包含类实现的可执行代码时出错,则返回 nil。”

所以 NSClassFromString() 似乎并不意味着实际加载类的命令。

于 2010-08-05T02:46:58.890 回答
-1

portrait_class/landscape_class 应该是一个Class对象,而不是id对象:

typedef struct objc_class *Class;
typedef struct objc_object {
    Class isa;
} *id;

(来自objc.h)

于 2010-08-05T03:14:58.167 回答