iOS应用程序,类突然消失,在alloc中崩溃

时间:2010-08-05 02:32:09

标签: iphone objective-c ipad objective-c-runtime

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

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

3 个答案:

答案 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)