IOS中线程所占用的内存空间

2017-12-12  本文已影响21人  有理想有暴富的小青年

转载自:http://blog.sina.com.cn/s/blog_14c9e57fa0102vrtd.html

设置线程堆栈的大小:

系统为每个你新创建的线程,都会为你的进程空间分配一定的内存作为该线程的堆栈。这里面有我们局部变量声明我们的方法就是一个堆栈。

如果你想改变一个给定线程的堆栈大小,你必须在创建该线程之前做一些操作。几乎所有线程技术都提供了相应的方法来设置堆栈的大小。

例如NSThread设置堆栈大小:

在IOS和MAC OS10.5之后,创建初始化一个NSThread最好不要用该类方法创建(detachNewThreadSelector:toTarget:withObject:),因为我们要设置线程的堆栈大小,我们调用start方法之前用setStackSize:方法来设置。(因为系统给默认的线程存储空间了,所以设置的意义并不大)

设置线程并存储一些信息:

我们如果想让线程存储这个线特有的信息以便在方面的时候用到他并且可以在线程之间传递信息。比如我们之前说过的runloop处理事件。可以存储处理了多少次事件的次数。

NSThread的threadDictionary方法返回一个NSMutableDictionary对象。我们可以在里面存储线程的一些信息。

线程的脱离状态:

有时候我们中断一个线程时候希望回收他的资源,脱离线程可以做到。与之相反的是可连接线程,他必须在推出之前必须被其他线程连接,并且可以拿到退出线程的数据。

大部分的上层线程技术默认是创建脱离线程。因为他们在线程完成时候立刻释放回收资源。

注意:当线程处于周期性工作而不被中断的时候比如保存数据到硬盘,可连接线程是最佳选择。

设置线程的优先级:

试想这样一个情况一个线程池里面有很多的线程。每个线程被创建的时候等级是一样的。我们假如想让某个线程先被执行可以设置这个线程的优先级高于其他线程,这样他会被先执行。

NSThread可以setThreadPriority方法设置当前运行线程的优先级

设置自动释放池:

之前我们说过在线程执行的一个方法里面可以设置run loop来处理事件并且可以用一个自动释放池来清理线程代码执行后的东西。

IOS在他们的每个线程必须创建至少一个自动释放池。主线程默认就创建了。有自动回收机制的应用创建自动释放池也不是必须的,只是他们被忽略掉。

因此我们在编写线程主体入口的时候要先创建一个自动释放池。在线程结束的时候自动释放他。例如一个循环我们应该每次循环一次创建并释放该自动释放池。我们可以用这样的方法来防止我们应用程序内存占用太造成的性能问题。

设置异常处理:

之前提到过如果一个线程的异常未捕获,可能造成你的应用强制退出因为其他的线程也不能捕获,因此我们最好在线程的主体入口写一个捕获线程异常的函数try/catch,用来捕获任何位置的异常。

设置run loop

当一个编写一个线程时候,我们可以让他执行一个长期的操作很少中断,线程完成时候退出。也可以让我们的线程放入一个循环里面,让他动态处理操作。后面这种做法就类似在线程里面加入一个runloop。你的主线程默认启动一个run loop。但是你创建自己的线程需要自己添加启动。后面我们会详细介绍。

中断线程:

我们退出一个线程推荐方法是让他在主体入口正常的退出。虽然系统API提供了直接杀死线程的方法,但是这样做会阻止线程清理内存等工作。会造成潜在的问题之前也说了。

因此我们可以设置我们线程响应取消或者退出消息。对于长时间的操作,这意味着要周期性来检查这个消息是不是到来,这样线程有机会来清理完成最终退出。我们可以用runloop的输入源来检测这个消息的到来。具体后面会详细介绍。

上一篇下一篇

猜你喜欢

热点阅读