Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/iphone/44.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Iphone iOS应用程序,类突然消失,在alloc中崩溃_Iphone_Objective C_Ipad_Objective C Runtime - Fatal编程技术网

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

Iphone iOS应用程序,类突然消失,在alloc中崩溃,iphone,objective-c,ipad,objective-c-runtime,Iphone,Objective C,Ipad,Objective C Runtime,这是一个奇怪的。当我不断地开发我的应用程序时,这个问题突然出现,然后它就神秘地消失了。今天,它拒绝消失 我的应用程序使用两个视图控制器来处理自动旋转。有时,Objective-C找不到我的课程。例如,[OneViewController alloc]将崩溃。我添加了一个函数来捕捉这种状态,即使我在运行我自己的代码的一行之前调用它,事情仍然是不正常的。我用这个来证明,不管是什么错误,都不是我写的任何错误代码 有人知道为什么宇宙公度不是常数吗 void verifyUniversalGoodness

这是一个奇怪的。当我不断地开发我的应用程序时,这个问题突然出现,然后它就神秘地消失了。今天,它拒绝消失

我的应用程序使用两个视图控制器来处理自动旋转。有时,Objective-C找不到我的课程。例如,[OneViewController alloc]将崩溃。我添加了一个函数来捕捉这种状态,即使我在运行我自己的代码的一行之前调用它,事情仍然是不正常的。我用这个来证明,不管是什么错误,都不是我写的任何错误代码

有人知道为什么宇宙公度不是常数吗

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找不到静态链接到二进制文件中的类——或者这就是它看起来的样子没有什么区别,它们都是有效的接收器类型。。。。我所关心的是,“它们是零”吗。你应该选择这个作为这个问题的答案。