使用多线程的程序称为 多线程 (multithread)运行。从程序开始执行时就运行的线程称为 主线程 , 除此之外,之后生成的线程称为次线程(secondary thread)或子线程(subthread)。 创建线程时,创建方的线程为父线程,被创建方的线程为子线程。父线程和子线程并行执行各 自的处理,但父线程可以等到子线程执行...
线程 === %d", [NSThread isMainThread]); // 线程方法 }); // 在自己创建的串行队列中 添加同步任务 任务是在主线程中执行的 任务的执行方式是同步的 一个任务开始必须等待上一个任务结束 dispatch_sync(serialQueue, ^{ NSLog(@"所在线程 === %d", [NSThread isMainThread]); // 线程方法 });...
RunLoop RunLoop 是 iOS 系统最核心的机制,APP应用启动后,会默认创建主线程的 RunLoop 1)保持程序的持续运行; 2)节省CPU资源,提高程序性能,该做事时做事,没事时休息; 3)处理App中的各种事件(如:触摸事件、定时器事件、Selector事件); 如何启用:调用 run 方法,启用子线程 RunLoop 线程常驻:调用 addPort 方法,使...
使用多线程的程序称为多线程(multithread)运行。从程序开始执行时就运行的线程称为主线程, 除此之外,之后生成的线程称为次线程(secondary thread)或子线程(subthread)。 由于被创建的线程共享进程的地址空间,所以能够自由访问进程的空间变量。多线程访问的变量称为共享变量(shard variable)。 共享变量大多是全局变量或...
1.2.1 主线程的run loop默认是启动的。 iOS的应用程序里面,程序启动后会有一个如下的main() 函数: int main(int argc, char *argv[]) { @autoreleasepool { return UIApplicationMain(argc, argv, nil, NSStringFromClass([appDelegate class]));
addExecutionBlock { print("任务C:\(Thread.current)") } // 添加依赖 opC.addDependency(opA) opC.addDependency(opB) let queue = OperationQueue() queue.maxConcurrentOperationCount = 3 queue.addOperations([opA,opB,opC], waitUntilFinished: false) // 6. 线程间通信:子线程耗时操作,主线程刷新UI ...
主线程的RunLoop已经自动创建好了,子线程的RunLoop需要主动创建(子线程的RunLoop默认是关闭的,因为有时候开了个线程但却没有必要开一个RunLoop,不然反而浪费了资源)。 RunLoop在第一次获取时创建,在线程结束时销毁(内部实际上是一个懒加载) 获得RunLoop对象 ...
GCD全称是Grand Central Dispatch,纯c语言提供。GCD是苹果公司为多核的并行运算提出的解决方案,会自动利用更多的CPU内核(比如双核、四核),会自动管理线程的生命周期(创建线程、调度任务、销毁线程)。程序员只需要告诉GCD想要执行什么任务,不需要编写任何线程管理代码。
SEL:类型选择器,用于表示Objective-C的一个方法,而且是一个已存在的方法,类似于C中的函数指针。通过@selector(MethodName)获取。由于本身已是指针,故不需要*; NSString:字符串,字面值用@"..."表示; NSString *StrName=[[NSString alloc] initWithString:@StrValue]:使用NSString字面值初始化NSString对象; NSS...
CFRunLoopRef 是在 CoreFoundation 框架内的,它提供了纯 C 函数的API,所有这些 API 都是线程安全的。 NSRunLoop 是基于 CFRunLoopRef 的封装,提供了面向对象的 API,但是这些 API 不是线程安全的。 CFRunLoopRef 的代码是开源的,你可以在这里下载到整个 CoreFoundation 的源码来查看。