2010-08-05 24 views
0

這是一個奇怪的。當我一直在處理我的應用程序時,這個問題已經出現,並且一直神祕地消失。今天它拒絕消失。iOS應用程序,類忽然消失,在分配崩潰

我的應用程序使用兩個視圖控制器來處理自動旋轉。有時,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; 

} 

下面是一個堆棧跟蹤看起來像如果我讓它運行調用頁頭的......

#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

你確定崩潰在'+ [OneViewController alloc]'?你是否重寫'alloc'或'allocWithZone:'? – dreamlax 2010-08-05 02:35:56

+0

問題是從未調用[OneViewController alloc],因爲目標c運行時無法找到名爲「OneViewCon troller」的類,當它查找該方法名稱時,它會變爲null,然後在嘗試調用時崩潰方法。當這個問題出現時,就像今天一樣,我甚至沒有編輯該類的代碼。鏈接時或運行時有問題。 – mtoy 2010-08-05 02:40:04

+0

對不起,不,我沒有實現alloc或allocwithZone – mtoy 2010-08-05 02:47:44

回答

1

感謝您對您的所有答覆。這讓我更加關注這個問題。事實證明,我關心的類是在一個庫中,主要在另一個庫中,並且這兩個庫都鏈接到我的最終二進制文件中。

我需要添加-Wl,-ObjC到我的連接線,並且這似乎有固定的東西,universalGoodness現在恢復。我不知道是什麼引發了這種需要的狀態,但我很高興能夠恢復業務。

+0

整潔。你應該選擇這個作爲這個問題的答案。 – 2010-08-22 17:31:36

0

我不知道答案,但我通過不同的措辭上達成NSClassFromString()和一個NSBundle的-(Class)classNamed:(NSString *)className

「如果沒有名稱類 當前加載由aClassName, 或零命名的類對象*如果aClassName是 零,返回零。「

VS

「爲類名。的類對象 返回nil如果類名不是一 與 接收器相關聯的類,或者如果有一個錯誤 裝載包含 可執行代碼班級實施「。

所以NSClassFromString()似乎並不意味着實際加載類的順序。

+0

但是,如果我的源代碼中寫着: - (void)finishStartup { verifyUniversalGoodness(); id x = [OneViewController alloc]; } 這應該不是鏈接或工作。根據我的小腦袋。 – mtoy 2010-08-05 02:57:58

+0

...只是可以肯定,我試圖調用NSBundle classNamed ...同樣的問題,classNamed無法找到一個靜態鏈接到二進制類 - 或者它看起來像 – mtoy 2010-08-05 03:09:01

-1

portrait_class/landscape_class應該是一個Class對象,而不是id對象:

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

(這是從objc.h)

+0

不會有所作爲,它們都是有效的接收機類型。 – dreamlax 2010-08-05 03:20:09

+0

......我所關心的是「他們是否爲零」 – mtoy 2010-08-05 03:23:09