2011-09-10 33 views
1

我開始一個新的線程從可可線程不能訪問可可API

- (void)applicationDidFinishLaunching:(NSNotification *)aNotification 

方法,使用

MyThread *thread1 = [[MyThread alloc] init] ; 
[thread1 start] ; 

其中MyThreadNSThread一個子類。

如果我在線程的main方法中運行一個空的for循環並退出,它工作正常。但只要我嘗試使用Cocoa API(例如NSString甚至NSAutoReleasePool),我的程序就會通過輸入調試器而掛起。

問題的根源是什麼?

[提示]:我嘗試通過調試程序,它曾經給我一個SIGBUS錯誤。存在哪些內存訪問問題?

+1

您是否在您的線程中設置了自動釋放池[按照文檔](http://developer.apple.com/library/mac/#documentation/Cocoa/Conceptual/Multithreading/CreatingThreads/CreatingThreads.html#//apple_ref/DOC/UID/10000057i-CH15-SW16)? –

+0

@Adam Rosenfeld:「但只要我嘗試使用...'NSAutoReleasePool',我的程序只是通過輸入調試器掛起。」 –

+0

請編輯您的問題以包含調試器的堆棧跟蹤。另外,你應該嘗試在樂器的殭屍模板下運行你的應用程序 - 如果你有過度釋放或者未被保留的東西,它會很快顯示出來,然後你可以查看對象的歷史記錄以找出你做錯了什麼。 –

回答

1

問題很棘手。我在我的main()方法中間聲明瞭一個1 MB的大字符數組。編譯器將此聲明推送到編譯方法的頂部。不知何故,這個空間太大而無法提出要求,因此程序在進入主要方法時會立即崩潰。不幸的是,即使我在聲明之前插入了一個return語句,程序也會崩潰,因爲編譯器會將此聲明推到最開始。我將該數組聲明更改爲malloc()並運行該程序。