2011-08-27 67 views
1

我必須執行一項繁重的任務。當我在主線程中運行它時,一切都很完美,但是當我嘗試從單獨的線程運行任務時,出現的錯誤是「現在沒有可供編程的內存:不安全的調用malloc」。OS X是否限制次要線程的內存使用量?

我使用的是+[NSThread detachNewThreadSelector:toTarget:withObject:],並且在必要時放置了所需的自動釋放池(也就是說,在開始時我分配並初始化它,然後在最後把它排空)。

我的問題是:在輔助線程中是否存在內存限制(可能堆棧內存被削減?)?我試圖用儀器進行調試,但沒有泄漏,應用程序崩潰。

+0

在調用detachNewThread之前調用** autorelease **嗎?如果你是這樣的話,那麼這個對象已經在你的主線程中自動釋放了,然後你嘗試從它已經離開的另一個線程訪問它。 –

+0

@MaurícioLinhares不,我不是。事實上,在應用程序中甚至沒有一個電話需要-autorelease。 –

+0

你爲什麼在討論排除autorelease池的問題?這是在新的線程?在你的項目上啓用NSZombie,它可能會幫助你 - > http://www.cocoadev.com/index.pl?NSZombieEnabled –

回答

1

查看Apple的文檔,可以使用-setStackSize:來增加堆棧大小。

http://developer.apple.com/library/mac/#documentation/Cocoa/Conceptual/Multithreading/CreatingThreads/CreatingThreads.html

但是,你必須分配對象,以便能夠設置該屬性。

+1

如果他得到的錯誤是「現在沒有可用的程序存儲空間:不安全的調用malloc',我想也許問題出在堆上。如果他沒有堆棧內存,他會得到一個堆棧溢出;-) –

+1

@Chaitanya Gupta如果涉及堆,我認爲主線程會導致同樣的問題。 – JohnBrighton

1

主線程有一個1MB的堆棧,二級堆棧的默認堆棧大小爲512KB。

你會得到這個錯誤信息是你用完了堆棧空間,因爲它在主線程上工作,但不是次要的我會說這正是你的問題。

如果可以的話,我的第一個建議是減少遞歸,因爲512KB開頭的時候非常慷慨,增加大小可能只會讓你的麻煩發生。有可能,直到該應用程序處於最終用戶手中時,纔會爲一星評論瘋狂地崩潰。

如果你想要一個更大的堆棧,那麼你必須自己實例化,配置和啓動堆棧。像這樣:

NSThread* t = [[NSThread alloc] initWithTarget:self 
             selector:@selector(someSelector:) 
             object:anArgument]; 
[t setStackSize:1024*1024]; 
[t start]; 

最小堆棧大小爲4K,大小必須以4K爲增量。

相關問題