2

我正在使用NSThread并为其设置堆栈大小,如下所示:

thread=[[NSThread alloc]initWithTarget:self selector:@selector(fibnocciForLoop) object:nil];
[thread setStackSize:12];
[thread start];    

正如为 for 编写的 Apple 文档-[NSThread setStackSize:]

讨论
您必须在开始线程之前调用此方法。在线程启动后设置堆栈大小会更改属性大小(由 stackSize 方法反映),但不会影响为线程预留的实际页数。

但是当我稍后在调试器中检查堆栈大小时,我没有得到我设置的值:

print (int)[thread stackSize]
$1 = 524288

setStackSize:我的问题是,如果该方法什么都不做,为什么还要存在?

请让我知道我错在哪里,或者APIsetStackSize:是否没有任何用处?

编辑: 关于这个问题,请参阅@Josh Caswell 的回答,我错过了 4K 中的 K ,因此上面的代码可以正常工作,如下所示:

  thread=[[NSThread alloc]initWithTarget:self
  selector:@selector(fibnocciForLoop) object:nil];
  [thread setStackSize:12*4096];//4K=4096
  [thread start];

这个问题的扩展:

有人可以解释一下为什么Apple给出了这个方法setStackSize,以及如何以及何时使用这个特定的方法,因为它需要用户进行大量计算才能计算出将使用多少字节。

我想知道它在 NSThread 中的确切用途?

谢谢!

4

2 回答 2

4

setStackSize:文件还说:

接收者的堆栈大小。此值必须以字节为单位,并且是 4KB 的倍数。

12 不是 4K 的倍数,因此您NSThread忽略了您的设置并可能使用其默认值,这似乎是 128 页(iOS(和 OS X)上的页面为 4KB)或 4 MB。

NSThread目前尚不清楚您想要 12 是什么意思,但如果您想使用您的设置,您需要将其更改为指示至少 4096 个字节。

于 2012-06-27T07:11:46.597 回答
-1

只需阅读您链接的文档,您是否尝试在 [start]之后调用 [setStackSize:12 ]?

thread=[[NSThread alloc]initWithTarget:self selector:@selector(fibnocciForLoop) object:nil];
[thread start]; 
[thread setStackSize:4096]; // multiple of 4KB

编辑:好的,没关系。我完全错误地阅读了文档。不要这样做。

于 2012-06-27T07:11:28.077 回答