Iphone iOS应用程序,类突然消失,在alloc中崩溃
这是一个奇怪的。当我不断地开发我的应用程序时,这个问题突然出现,然后它就神秘地消失了。今天,它拒绝消失 我的应用程序使用两个视图控制器来处理自动旋转。有时,Objective-C找不到我的课程。例如,[OneViewController alloc]将崩溃。我添加了一个函数来捕捉这种状态,即使我在运行我自己的代码的一行之前调用它,事情仍然是不正常的。我用这个来证明,不管是什么错误,都不是我写的任何错误代码 有人知道为什么宇宙公度不是常数吗Iphone iOS应用程序,类突然消失,在alloc中崩溃,iphone,objective-c,ipad,objective-c-runtime,Iphone,Objective C,Ipad,Objective C Runtime,这是一个奇怪的。当我不断地开发我的应用程序时,这个问题突然出现,然后它就神秘地消失了。今天,它拒绝消失 我的应用程序使用两个视图控制器来处理自动旋转。有时,Objective-C找不到我的课程。例如,[OneViewController alloc]将崩溃。我添加了一个函数来捕捉这种状态,即使我在运行我自己的代码的一行之前调用它,事情仍然是不正常的。我用这个来证明,不管是什么错误,都不是我写的任何错误代码 有人知道为什么宇宙公度不是常数吗 void verifyUniversalGoodness
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
我不知道答案,但NSClassFromString()和NSBundle的
-(Class)classNamed:(NSString*)className
“由aClassName命名的类对象,
如果没有使用该名称的类,则为nil
当前已加载*。如果aClassName为
nil,返回nil。“
vs
“className的类对象。
如果className不是一,则返回nil
与
接收器或如果有错误
加载包含以下内容的可执行代码
类的实现。”
因此NSClassFromString()似乎并不意味着实际加载类的顺序。
纵向类/横向类
应该是类
对象,而不是id
对象:
typedef struct objc_class *Class;
typedef struct objc_object {
Class isa;
} *id;
(来自objc.h)感谢您的回复。这让我更仔细地研究了这个问题。事实证明,我关心的类在一个库中,main在另一个库中,两个库都链接到我的最终二进制文件中
我需要将-Wl,-ObjC添加到我的链接行中,这似乎已经解决了问题,universalGoodness现在已经恢复。我不知道是什么触发了需要此功能的状态,但我很高兴重新开始工作。您确定崩溃发生在
+[OneViewController alloc]
中吗?您是否重写了alloc
或allocWithZone:
?问题是从来没有调用过[OneViewController alloc],因为objective c运行时找不到名为“OneViewCon Controller”的类,当它查找该方法名时,它会变为null,然后在尝试调用该方法时崩溃。当这个问题出现时,就像今天一样,我甚至没有编辑这个类的代码。链接时或运行时出现问题。抱歉。。。不,我没有实现alloc或allocwithZoneDoes您的类实现一个初始化
方法吗?只是initWithNibName:bundle:True,但是,如果我的源代码说:-(void)finishStartup{VerifyUniversalGoDness();id x=[OneViewController alloc];},这应该不会链接,也不会工作。根据我小小的大脑。。。。为了确定我试着打电话给NSBundle CLASSNAME。。。同样的问题,classNamed找不到静态链接到二进制文件中的类——或者这就是它看起来的样子没有什么区别,它们都是有效的接收器类型。。。。我所关心的是,“它们是零”吗。你应该选择这个作为这个问题的答案。