Multithreading Cocoa线程无法访问Cocoa API

Multithreading Cocoa线程无法访问Cocoa API,multithreading,cocoa,Multithreading,Cocoa,我正在开始一个新的线程从 - (void)applicationDidFinishLaunching:(NSNotification *)aNotification 方法,使用 MyThread *thread1 = [[MyThread alloc] init] ; [thread1 start] ; 其中MyThread是NSThread的子类 如果我在线程的main方法中运行一个空的for循环并退出,它就可以正常工作。但是,只要我尝试使用CocoaAPI,比如NSString或者甚至

我正在开始一个新的线程从

- (void)applicationDidFinishLaunching:(NSNotification *)aNotification 
方法,使用

MyThread *thread1 = [[MyThread alloc] init] ;
[thread1 start] ;
其中
MyThread
NSThread
的子类

如果我在线程的
main
方法中运行一个空的
for
循环并退出,它就可以正常工作。但是,只要我尝试使用CocoaAPI,比如
NSString
或者甚至
NSAutoReleasePool
,我的程序就会因为进入调试器而挂起

问题的根源是什么


[提示]:我尝试单步通过调试器,但它曾经给我一个
SIGBUS
错误。可能存在哪些内存访问问题?

问题很棘手。我在我的MIN()方法中间声明了一个1兆字节的大字符数组。编译器正在将此声明推送到已编译方法的顶部。不知何故,这个空间太大,无法请求,因此程序在进入主方法时会立即崩溃。不幸的是,即使在声明之前插入了return语句,程序也会崩溃,因为编译器会将声明推到最开始。我将该数组声明更改为malloc(),程序运行。

问题很棘手。我在我的MIN()方法中间声明了一个1兆字节的大字符数组。编译器正在将此声明推送到已编译方法的顶部。不知何故,这个空间太大,无法请求,因此程序在进入主方法时会立即崩溃。不幸的是,即使在声明之前插入了return语句,程序也会崩溃,因为编译器会将声明推到最开始。我将该数组声明更改为malloc(),程序运行。

是否在线程中设置自动释放池?@Adam Rosenfeld:“但只要我尝试使用……
NSAutoReleasePool
,我的程序就会通过进入调试器而挂起。”请编辑您的问题,以包含调试器中的堆栈跟踪。此外,如果你有过多发布或过少保留的内容,你应该尝试在Instruments的僵尸模板下运行你的应用程序,这将很快揭示出来,然后你可以查看对象的历史记录,找出你做错了什么。一定是其他地方的原因造成了这种情况。这对我来说很有效me@euphoria83在函数或方法中声明数组时,将在堆栈上创建该数组。线程的默认堆栈大小必须小于1MB,因此操作系统不允许您在那里创建阵列。使用
malloc
将数据存储在堆上,堆可以比堆栈大得多。您可能应该将您的评论作为答案发布,并接受给未来的读者。您是否在线程中设置了自动释放池?@Adam Rosenfeld:“但只要我尝试使用……
NSAutoReleasePool
,我的程序就会通过进入调试器而挂起。”请编辑您的问题,以包括调试器的堆栈跟踪。此外,如果你有过多发布或过少保留的内容,你应该尝试在Instruments的僵尸模板下运行你的应用程序,这将很快揭示出来,然后你可以查看对象的历史记录,找出你做错了什么。一定是其他地方的原因造成了这种情况。这对我来说很有效me@euphoria83在函数或方法中声明数组时,将在堆栈上创建该数组。线程的默认堆栈大小必须小于1MB,因此操作系统不允许您在那里创建阵列。使用
malloc
将数据存储在堆上,堆可以比堆栈大得多。你可能应该把你的评论作为一个答案发表出来,并接受给未来的读者。