- 浏览: 1504467 次
- 性别:
- 来自: 南京
文章分类
- 全部博客 (419)
- XMPP (19)
- Android (180)
- Java (59)
- Network (4)
- HTML5 (13)
- Eclipse (9)
- SCM (23)
- C/C++ (4)
- UML (4)
- Libjingle (15)
- Tools&Softwares (29)
- Linphone (5)
- Linux&UNIX (6)
- Windows (18)
- Google (10)
- MISC (3)
- SIP (6)
- SQLite (5)
- Security (4)
- Opensource (29)
- Online (2)
- 文章 (3)
- MemoryLeak (10)
- Decompile (5)
- Ruby (1)
- Image (1)
- Bat (4)
- TTS&ASR (28)
- Multimedia (1)
- iOS (20)
- Asciiflow - ASCII Flow Diagram Tool.htm (1)
- Networking (1)
- DLNA&UPnP (2)
- Chrome (2)
- CI (1)
- SmartHome (0)
- CloudComputing (1)
- NodeJS (3)
- MachineLearning (2)
最新评论
-
bzhao:
点赞123!
Windows的adb shell中使用vi不乱码方法及AdbPutty -
wahahachuang8:
我觉得这种东西自己开发太麻烦了,就别自己捣鼓了,找个第三方,方 ...
HTML5 WebSocket 技术介绍 -
obehavior:
view.setOnTouchListenerview是什么
[转]android 一直在最前面的浮动窗口效果 -
wutenghua:
[转]android 一直在最前面的浮动窗口效果 -
zee3.lin:
Sorry~~
When I build "call ...
Step by Step about How to Build libjingle 0.4
http://www.cocoachina.com/bbs/read.php?tid=43852
OS 支持多个层次的多线程
编程,层次越高的抽象程度越高,使用起来也越方便,也是苹果最推荐使用的方法。
下面简要说明这三种不同范式:
Thread 是这三种范式里面相对轻量级的,但也是使用起来最负责的,你需要自己管理thread的生命周期,线程
之间的同步。线程
共享同一应用程序的部分内存空间,它们拥有对数据相同的访问权限。
你得协调多个线程
对同一数据的访问,一般做法是在访问之前加锁,这会导致一定的性能开销。在 iOS 中我们可以使用多种形式的 thread:
Cocoa threads: 使用NSThread 或直接从 NSObject 的类方法 performSelectorInBackground:withObject: 来创建一个线程
。如果你选择thread来实现多线程
,那么 NSThread 就是官方推荐优先选用的方式。
POSIX threads: 基于 C 语言的一个多线程
库,
Cocoa operati*****是基于 Obective-C实现的,类 NSOperation 以面向对象的方式封装了用户需要执行的操作,我们只要聚焦于我们需要做的事情,而不必太操心
线程
的管理,同步等事情,
因为NSOperation已经为我们封装了这些事情。 NSOperation 是一个抽象基类,我们必须使用它的子类。iOS 提供了两种默认实现:NSInvocationOperation 和 NSBlockOperation。
Grand Central Dispatch : iOS4 才开始支持,它提供了一些新的特性,以及运行库来支持多核并行编程,它的关注点更高:如何在多个 cpu 上提升效率。
有了上面的总体框架,我们就能清楚地知道不同方式所处的层次以及可能的效率,便利性差异。下面我们先来看看 NSThread 的使用,包括创建,启动,同步,通信等相关知识。这些与 win32/Java 下的 thread 使用非常相似。
线程
创建与启动
NSThread的创建主要有两种直接方式:
[NSThread detachNewThreadSelector:@selector(myThreadMainMethod:) toTarget:self withObject:nil];
和
NSThread* myThread = [[NSThread alloc] initWithTarget:self
selector:@selector(myThreadMainMethod:)
object:nil];
[myThread start];
这两种方式的区别是:前一种一调用就会立即创建一个
线程
来做事情;而后一种虽然你 alloc 了也 init了,但是要直到我们手动调用 start 启动线程
时才会真正去创建线程
。
这种延迟实现思想在很多跟资源相关的地方都有用到。后一种方式我们还可以在启动线程
之前,对线程
进行配置,比如设置 stack 大小,线程
优先级。
还有一种间接的方式,更加方便,我们甚至不需要显式编写 NSThread 相关代码。那就是利用 NSObject 的类方法 performSelectorInBackground:withObject: 来创建一个
线程
:
[myObj performSelectorInBackground:@selector(myThreadMainMethod) withObject:nil];
其效果与 NSThread 的 detachNewThreadSelector:toTarget:withObject: 是一样的。
线程
同步
线程
的同步方法跟其他系统下类似,我们可以用原子操作,可以用 mutex,lock等。
iOS的原子操作函数是以 OSAtomic开头的,比如:OSAtomicAdd32, OSAtomicOr32等等。这些函数可以直接使用,因为它们是原子操作。
iOS中的 mutex 对应的是 NSLock,它遵循 NSLooking协议,我们可以使用 lock, tryLock, lockBeforeData:来加锁,用 unLock来解锁。使用示例:
BOOL moreToDo = YES;
NSLock *theLock = [[NSLock alloc] init];
...
while (moreToDo) {
/* Do another increment of calculation */
/* until there’s no more to do. */
if ([theLock tryLock]) {
/* Update display used by all threads. */
[theLock unlock];
}
}
我们可以使用指令 @synchronized 来简化 NSLock的使用,这样我们就不必显示编写创建NSLock,加锁并解锁相关代码。
- (void)myMethod:(id)anObj
{
@synchronized(anObj)
{
// Everything between the braces is protected by the @synchronized directive.
}
}
还有其他的一些锁对象,比如:循环锁NSRecursiveLock,条件锁NSConditionLock,分布式锁NSDistributedLock等等,在这里就不一一介绍了,大家去看官方文档吧。
用NSCodition同步执行的顺序
NSCodition 是一种特殊类型的锁,我们可以用它来同步操作执行的顺序。它与 mutex 的区别在于更加精准,等待某个 NSCondtion 的线程
一直被 lock,直到其他线程
给那个 condition 发送了信号。
下面我们来看使用示例:
某个线程
等待着事情去做,而有没有事情做是由其他线程
通知它的。
[cocoaCondition lock];
while (timeToDoWork <= 0)
[cocoaCondition wait];
timeToDoWork--;
// Do real work here.
[cocoaCondition unlock];
其他
线程
发送信号通知上面的线程
可以做事情了:
[cocoaCondition lock];
timeToDoWork++;
[cocoaCondition signal];
[cocoaCondition unlock];
线程
间通信
线程
在运行过程中,可能需要与其它线程
进行通信。我们可以使用 NSObject 中的一些方法:
在应用程序主线程
中做事情:
performSelectorOnMainThread:withObject:waitUntilDone:
performSelectorOnMainThread:withObject:waitUntilDone:modes:
在指定
线程
中做事情:
performSelector:onThread:withObject:waitUntilDone:
performSelector:onThread:withObject:waitUntilDone:modes:
在当前
线程
中做事情:
performSelector:withObject:afterDelay:
performSelector:withObject:afterDelay:inModes:
取消发送给当前
线程
的某个消息
cancelPreviousPerformRequestsWithTarget:
cancelPreviousPerformRequestsWithTarget:selector:object:
如在我们在某个
线程
中下载数据,下载完成之后要通知主线程
中更新界面等等,可以使用如下接口:- (void)myThreadMainMethod
{
NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init];
// to do something in your thread job
...
[self performSelectorOnMainThread:@selector(updateUI) withObject:nil waitUntilDone:NO];
[pool release];
}
RunLoop
说到 NSThread 就不能不说起与之关系相当紧密的 NSRunLoop。Run loop 相当于 win32 里面的消息循环机制,它可以让你根据事件/消息(鼠标消息,键盘消息,计时器消息等)来调度线程
是忙碌还是闲置。
系统会自动为应用程序的主线程
生成一个与之对应的 run loop 来处理其消息循环。在触摸 UIView 时之所以能够激发 touchesBegan/touchesMoved 等等函数被调用,
就是因为应用程序的主线程
在 UIApplicationMain 里面有这样一个 run loop 在分发 input 或 timer 事件。
发表评论
-
Nuance - Dragon Mobile SDK - Speech Kit
2012-07-02 15:57 1415http://dragonmobile.nuancemobil ... -
iOS的开源库和开源项目
2012-06-14 10:54 1026http://www.cocoachina.com/iphon ... -
[iOS开发教程-5]Create Indexed UITableView
2012-06-13 16:31 1743http://www.iphonedevcentral.com ... -
[iOS开发教程-4]Create a UITabBarController from scratch
2012-06-13 15:20 1434http://www.iphonedevcentral.com ... -
[iOS开发教程-3]Create a Detail View Page using UIImageView, UITextView and UILabel
2012-06-13 14:11 2137http://www.iphonedevcentral.com ... -
[iOS开发教程-2]Customize that UIViewCell – Part 1: Using Interface Builder
2012-06-13 13:00 1488http://www.iphonedevcentral.com ... -
[iOS开发教程-1]Hello UITableView!
2012-06-13 11:12 2083http://www.iphonedevcentral.com ... -
Window 7主机与VMware中Mac虚拟机共享文件夹
2012-06-08 23:28 191421. 确保针对Mac虚拟机的VMware Tools的安装 ... -
VMware 8.02虚拟机安装MAC lion 10.7.3教程 附送原版提取镜像InstallESD.iso!
2012-06-08 23:14 6365http://www.winthink.net/thread- ... -
Object-C中的Selector概念
2012-06-08 15:25 1103selector可以叫做选择器,其实指的就是对象的方法,也 ... -
CodeBlocks集成Objective-C
2012-06-05 23:35 1194http://www.jxva.com/?act=blog!a ... -
用ultraEdit打造自己的Objective-C IDE for Windows
2012-06-05 21:41 1488http://blog.csdn.net/tomatofly/ ... -
Windows下UltraEdit查看Objective-C代码高亮工具
2012-06-05 21:26 2497http://www.cocoachina.com/bbs/r ... -
Objective-C 编程教程(全)
2012-06-04 23:32 1284http://www.youku.com/playlist_s ... -
iPhone开发学习笔记
2012-06-04 22:15 2685http://blog.csdn.net/huanglx198 ... -
Installing and using GNUstep and Objective-C on Windows
2012-06-04 16:49 1053http://www.techotopia.com/index ... -
GNUStep
2012-06-04 16:45 1246http://www.gnustep.org/ T ... -
Objective C programming in Windows – GNUStep & ProjectCenter
2012-06-04 16:12 1154http://www.jaysonjc.com/program ... -
The Objective-C Programming Language
2012-06-03 19:31 1034http://developer.apple.com/libr ...
相关推荐
iOS多线程开发一 使用NSThread NSThread的基本使用 // demo说明 NSThreadDemoOne: 简单使用多线程,区分有多线程和没有多线的区别 NSThreadDemoTwo: 因为NSThread只能传一个一个参数,如果咬传递多个参数,使用封装...
iOS 多线程开发 NSThread 是 iOS 平台上支持的多线程编程方式之一。多线程编程是指一个应用程序同时执行多个线程,以提高应用程序的响应速度和效率。iOS 支持多个层次的多线程编程,层次越高的抽象程度越高,使用...
本示例将深入探讨两种最基础的多线程实现方式:pthread和NSThread。 首先,我们来理解一下多线程的概念。多线程是指在一个进程中可以同时执行多个独立的执行序列,每个序列称为一个线程。通过使用多线程,开发者...
在iOS开发中,多线程技术是...总的来说,`NSThread`是iOS多线程编程的一个基础工具,对于理解线程概念和操作有着重要意义。但在实际开发中,考虑到性能和易用性,开发者通常会选择GCD或NSOperationQueue来实现多线程。
iOS多线程编程是iOS开发中的一...总之,iOS多线程编程需要开发者深入理解线程的原理和管理,熟悉各种同步工具和并发编程技术。掌握多线程编程能大幅提升应用的运行效率和响应速度,是iOS开发者必须具备的一项重要技能。
本文将深入探讨四种常用的iOS多线程开发方式:pthread、NSThread、NSOperation及NSOperationQueue,以及Grand Central Dispatch(GCD)。 首先,让我们了解下pthread。pthread是POSIX线程库,它在iOS中被用于跨平台...
iOS多线程编程指南是一份深入介绍iOS平台下多线程编程技术的文档。文档主要涵盖的技术点包括NSThread、NSOperation以及Grand Central Dispatch(GCD),这些技术是iOS开发者在开发应用程序时常用的技术。 首先,...
本文将深入探讨“iOS多线程Demo”所体现的核心知识点,并结合实际应用进行详细阐述。 首先,我们要了解多线程的概念。在单线程程序中,所有的任务都是顺序执行的,而在多线程环境中,可以同时处理多个任务,从而...
本主题将深入探讨两个经典iOS多线程的例子,主要涉及`NSThread`类的使用。 一、多线程基础 在iOS中,多线程主要包括以下几种方式: 1. **NSThread**:轻量级的线程实现,开发者可以直接创建和管理线程。`NSThread...
### iOS多线程编程技术详解:NSThread、Cocoa NSOperation、GCD #### 一、多线程基本概念 1. **进程**:在移动设备(如iPhone)上,每一个应用程序都可以被视为一个独立的进程。每个进程都会有一个主线程(main ...
总的来说,NSThread是iOS开发中实现多线程的一种方式,它提供了简单易用的接口,适合对线程有直接控制需求的场景。然而,对于更复杂的多线程需求,如负载均衡、并发控制,开发者通常会选择GCD或OperationQueue。在...
在iOS应用开发中,多线程技术是必不可...这个源码可以帮助初学者深入理解iOS应用中的多线程概念,为实际项目开发打下坚实基础。在实践中,还可以结合NSOperationQueue、GCD等高级技术,进一步提升代码的可读性和性能。
总的来说,iOS开发中的多线程技术涉及NSThread、POSIX Thread、NSOperation与NSOperationQueue以及GCD等,它们各有优势和使用场景。而RunLoop是管理线程生命周期的关键组件,对于理解iOS应用性能优化至关重要。掌握...
iOS多线程编程指南所涉及的知识点涵盖了多线程编程在iOS平台的应用,包括线程概念、线程管理、RunLoop对象、线程同步等核心概念以及具体实现技术。鉴于文档内容丰富,这里将详细解读并阐述上述知识点。 ### 1. 线程...
iOS多线程是移动应用开发中不可或缺的技术,它允许程序在后台执行耗时任务,同时保持主线程的流畅,从而提供良好的用户体验。本文将深入探讨iOS的三种主要多线程编程方式:NSThread、NSOperation和NSOperationQueue...
在探讨iOS多线程的面试题目时,我们首先要明确进程和线程的定义及其关系。进程可以被理解为计算机上一次执行活动的程序,它是操作系统分配资源的基本单元,拥有独立的内存空间和运行所需的全部资源。当我们提到一个...
《Objective-C高级编程:iOS与OS X多线程和内存管理》是一本深入探讨Objective-C在iOS和OS X平台上的核心特性的书籍。本书重点聚焦于多线程和内存管理两个关键领域,对于iOS和macOS应用开发人员来说,这是理解和优化...
本文将根据"ios多线程资料01"的标题和描述,深入探讨iOS平台上的多线程概念、实现方式以及性能优化策略。 首先,我们要理解什么是多线程。在计算机程序中,线程是程序执行的基本单元,一个进程可以包含多个线程。在...
在iOS开发中,多线程的实现方式主要有三种,NSThread、NSOperation和GCD,我前面博客中对NSOperation和GCD有了较为详细的实现,为了学习的完整性,今天我们主要从代码层面来实现NSThread的使用。案例代码上传至 ...
在iOS应用开发中,NSThread是苹果提供的一个用于多线程编程的重要类,它允许开发者在应用程序中创建和管理线程。在这个名为"NSThread.zip"的压缩包中,我们很可能是得到了一个示例项目或者代码库,专门展示了如何在...