IOS 创建并发线程的实例详解

创建并发线程
主线程一般都是处理UI界面及用户交互的事儿的。其他的事一般就要另外的线程去处理,如下载,计算等。。。
现在先简单创建3个线程,分别打印出1-1000,,为了方便,线程3就放在主线程中执行。
- (void) firstCounter{
@autoreleasepool {
NSUInteger counter = 0;
for (counter = 0;
counter < 1000;
counter++){
NSLog(@"First Counter = %lu", (unsigned long)counter);
}
}
}
- (void) secondCounter{
@autoreleasepool {
NSUInteger counter = 0;
for (counter = 0;
counter < 1000;
counter++){
NSLog(@"Second Counter = %lu", (unsigned long)counter);
}
}
}
- (void) thirdCounter{
NSUInteger counter = 0;
for (counter = 0;
counter < 1000;
counter++){
NSLog(@"Third Counter = %lu", (unsigned long)counter);
}
}
- (void)viewDidLoad {
[super viewDidLoad];
[NSThread detachNewThreadSelector:@selector(firstCounter)
toTarget:self
withObject:nil];
[NSThread detachNewThreadSelector:@selector(secondCounter)
toTarget:self
withObject:nil];
/* Run this on the main thread */
[self thirdCounter];
}
由于thirdCounter 函数没有运行在单独的线程中,所以不需要自动释放池(autorelease pool)。这个方法将在应用程序的主线程中运行,每一个Cocoa Touch程序都会自
动的给该主线程创建一个自动释放池。
在代码的最后通过调用 detachNewThreadSelector,把将第一个计数器和第二个计数器运行在独立的线程中。现在,如果你运行程序,将会在控制台窗口看到如下信息:
Second Counter = 921 Third Counter = 301 Second Counter = 922 Second Counter = 923 Second Counter = 924 First Counter = 956 Second Counter = 925 Counter = 957 Second Counter = 926 First Counter = 958 Third Counter = 302 Second Counter = 927 Third Counter = 303 Second Counter = 928
可以看出,这三个计时器是同时运行的,他们输出的内容是随机交替的。 每一个线程必须创建一个 autorelease pool。在 autorelease pool 被 release 之前,autorelease pool 会一直持有被 autoreleased 的对象的引用。在引用计数内存管理环境中这是一个非常重要的机制,例如Cocoa Touch中的对象就能够被autoreleased。无论何时,在创建一个对象实例时,该对象的引用计数是1,但是当创建的autorelease pool对象被release了,那么 autorelease 的对象同样会发送一个 release 消息,如果此时,它的引用计数仍然是 1,那么该对象将被销毁。
每一个线程都需要创建一个 autorelease pool,当做是该线程第一个被创建的对象。如果不这样做,如果不这样做,当线程退出的时候,你分配在线程中的对象会发生内存泄露。为了更好的理解,我们来看看下面的代码:
- (void) autoreleaseThread:(id)paramSender{
NSBundle *mainBundle = [NSBundle mainBundle];
NSString *filePath = [mainBundle pathForResource:@"AnImage"
ofType:@"png"];
UIImage *image = [UIImage imageWithContentsOfFile:filePath];
/* Do something with the image */
NSLog(@"Image = %@", image);
}
- (void)viewDidLoad {
[super viewDidLoad];
[NSThread detachNewThreadSelector:@selector(autoreleaseThread:)
toTarget:self
withObject:self];
}
如果你运行这段代码,,你就会在控制台窗口看到这样的输出信息:
*** __NSAutoreleaseNoPool(): Object 0x5b2c990 of
class NSCFString autoreleased with no pool in place - just leaking
*** __NSAutoreleaseNoPool(): Object 0x5b2ca30 of
class NSPathStore2 autoreleased with no pool in place - just leaking
*** __NSAutoreleaseNoPool(): Object 0x5b205c0 of
class NSPathStore2 autoreleased with no pool in place - just leaking
*** __NSAutoreleaseNoPool(): Object 0x5b2d650 of
class UIImage autoreleased with no pool in place - just leaking
上面的信息显示了我们创建的 autorelease 的 UIImage 实例产生了一个内存泄露,另外,FilePath 和其他的对象也产生了泄露。这是因为在我们的线程中,没有在开始的时候创建和初始化一个autorelease pool。下面是正确的代码,你可以测试一下,确保它没有内存泄露:
- (void) autoreleaseThread:(id)paramSender{
@autoreleasepool {
NSBundle *mainBundle = [NSBundle mainBundle];
NSString *filePath = [mainBundle pathForResource:@"AnImage"
ofType:@"png"];
UIImage *image = [UIImage imageWithContentsOfFile:filePath];
/* Do something with the image */
NSLog(@"Image = %@", image);
}
}
以上使用关于IOS 并发线程的实例,如有疑问大家可以留言讨论,共同进步,感谢阅读,希望能帮助到大家,谢谢大家对本站的支持!
# IOS
# 创建并发线程
# 并发线程
# IOS 线程死锁详细介绍
# 详解iOS 多线程 锁 互斥 同步
# 详解iOS多线程之2.NSThread的加锁@synchronized
# iOS开发网络篇—实现大文件的多线程断点下载
# IOS多线程实现多图片下载(一)
# 详解iOS中多线程app开发的GCD队列的使用
# 在IOS中为什么使用多线程及多线程实现的三种方法
# 创建一个
# 如果你
# 第一个
# 其他的
# 会在
# 这样做
# 都是
# 产生了
# 放在
# 你可以
# 你就
# 将在
# 不需要
# 如有
# 计时器
# 这段
# 这是一个
# 希望能
# 第二个
# 来看看
相关文章:
开源网站制作软件,开源网站什么意思?
建站之星如何快速更换网站模板?
如何获取开源自助建站系统免费下载链接?
Swift中swift中的switch 语句
企业微网站怎么做,公司网站和公众号有什么区别?
如何快速查询网址的建站时间与历史轨迹?
建站之星×万网:智能建站系统+自助建站平台一键生成
家具网站制作软件,家具厂怎么跑业务?
义乌企业网站制作公司,请问义乌比较好的批发小商品的网站是什么?
建站主机选购指南与交易推荐:核心配置解析
股票网站制作软件,网上股票怎么开户?
大连网站制作公司哪家好一点,大连买房网站哪个好?
制作证书网站有哪些,全国城建培训中心证书查询官网?
建站主机空间推荐 高性价比配置与快速部署方案解析
如何通过商城免费建站系统源码自定义网站主题?
如何在Ubuntu系统下快速搭建WordPress个人网站?
云南网站制作公司有哪些,云南最好的招聘网站是哪个?
建站主机选购指南:核心配置与性价比推荐解析
青浦网站制作公司有哪些,苹果官网发货地是哪里?
如何通过云梦建站系统实现SEO快速优化?
深圳防火门网站制作公司,深圳中天明防火门怎么编码?
焦点电影公司作品,电影焦点结局是什么?
ppt制作免费网站有哪些,ppt模板免费下载网站?
详解免费开源的DotNet二维码操作组件ThoughtWorks.QRCode(.NET组件介绍之四)
交易网站制作流程,我想开通一个网站,注册一个交易网址,需要那些手续?
制作ppt免费网站有哪些,有哪些比较好的ppt模板下载网站?
如何通过宝塔面板实现本地网站访问?
C++如何使用std::optional?(处理可选值)
如何用VPS主机快速搭建个人网站?
建站之星在线版空间:自助建站+智能模板一键生成方案
如何通过NAT技术实现内网高效建站?
怀化网站制作公司,怀化新生儿上户网上办理流程?
陕西网站制作公司有哪些,陕西凌云电器有限公司官网?
已有域名建站全流程解析:网站搭建步骤与建站工具选择
手机网站制作与建设方案,手机网站如何建设?
MySQL查询结果复制到新表的方法(更新、插入)
如何在云主机上快速搭建网站?
建站主机选哪家性价比最高?
制作表格网站有哪些,线上表格怎么弄?
网站制作价目表怎么做,珍爱网婚介费用多少?
如何安全更换建站之星模板并保留数据?
成都网站制作报价公司,成都工业用气开户费用?
高防网站服务器:DDoS防御与BGP线路的AI智能防护方案
教学论文网站制作软件有哪些,写论文用什么软件
?
Android使用GridView实现日历的简单功能
Python lxml的etree和ElementTree有什么区别
如何在阿里云高效完成企业建站全流程?
html制作网站的步骤有哪些,iapp如何添加网页?
c++怎么编写动态链接库dll_c++ __declspec(dllexport)导出与调用【方法】
ppt在线制作免费网站推荐,有什么下载免费的ppt模板网站?
*请认真填写需求信息,我们会在24小时内与您取得联系。