#import <pthread.h>
- (void)pthreadDemo { /** pthread & socket 返回值: - 若线程创建成功,则返回 0 - 若线程创建失败,则返回出错编号 参数: 1> 第一个参数为指向线程标识符的指针 1) 在 C 语言框架中,没有对象的概念,对象是通过结构体来实现的 2) 通常"对象"的类型,会以 _t / Ref 结尾 3) 定义的时候,不需要使用 '*' 2> 第二个参数用来设置线程属性 3> 第三个参数是线程运行"函数"的"起始地址" void *(*)(void *) * block 匿名的函数指针 * 定义: 返回值 (^) (参数) 在 C 语言中的 void * 和 OC 中的 id 是等价的 id (函数名就是指向函数起始位置的地址 的别名) (id) * 数组名:指向数组第一个元素的地址 4> 最后一个参数是运行函数的参数 关于 __bridge - 桥接 内存管理的概念: ARC 自动管理内存! 特点: 1> 编译器在编译代码的时候,会根据 "OC 代码"的结构,自动添加 retain/release/autorelease 2> ARC 只负责 OC 部分的代码,不负责 C/C++ 语言部分的代码 3> 如果开发的时候,涉及到混合语言开发,如果使用 C 语言的函数,出现 create/copy/retain/new 等字样,大多数需要程序员手动 'release',否则会出现内存泄漏 4> 在混合开发的时候,如果涉及到 C 框架 和 OC 框架之间传递参数,需要使用 "桥接" 告诉编译器如何管理内存 __bridge 就是保留原有的管理方式 5> 提问:MRC 中需要使用桥接吗?不需要!MRC中所有内存都是程序员负责的! 6> 提问:管理内存,管理的是哪一区域的内存:堆区!特点:alloc/copy/retain 等等字样的函数都是和堆区有关的! 有关桥接的增加:直接利用 Xcode 的智能提示就可以! */ pthread_t threadId = NULL; // 准备参数 id str = @"hello thread"; int result = pthread_create(&threadId, NULL, demo, (__bridge void *)(str)); if (result) { NSLog(@"线程创建失败 %d", result); } else { NSLog(@"OK"); } }
// 线程要调用执行的函数 // [NSThread currentThread] 可以在所有的多线程技术中使用! // 查看当前代码执行所在的线程 void * demo (void * param) { NSString *str = (__bridge NSString *)(param); NSLog(@"%@ --- %@", [NSThread currentThread], str); return NULL; }
