全网整合营销服务商

电脑端+手机端+微信端=数据同步管理

免费咨询热线:400-708-3566

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

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小时内与您取得联系。