本文并非最终版本,如果想要关注更新或更正的内容请关注文集,联系方式详见文末,如有疏忽和遗漏,欢迎指正。
本文相关目录:
==================== 所属文集:4.0 多线程 ====================
4.1 多线程基础->1.0 进程 & 线程
······················ 2.0 多线程简介
4.2 pthread
4.3 NSThread->1.0 创建线程
····················· 2.0 线程属性
····················· 3.0 线程状态/线程生命周期
····················· 4.0 多线程安全隐患
····················· 5.0 线程间通讯和常用方法
4.4 GCD->1.0 GCD简介和使用
·············· 2.0 线程间的通信
·············· 3.0 其他用法
·············· 4.0 GCD 的定时器事件
4.5 NSOperation->1.0 NSOperation简介
························ 2.0 NSOperationQueue
························ 3.0 线程间通信
························ 4.0 自定义NSOperation
4.6 RunLoop - 运行循环
===================== 所属文集:4.0 多线程 =====================
4.2.1 创建线程 - pthread_create
pthread_create
/*
<#pthread_t *restrict#> 线程的id,指向线程标识符的指针,C 语言中类型的结尾通常 _t/Ref,而且不需要使用 *
<#const pthread_attr_t *restrict#> 用来设置线程的属性 (一般为 NULL)
<#void *(*)(void *)#> 新建立的线程执行代码的函数,线程开启后需要调用的函数或方法 (指向函数的指针)
<#void *restrict#> 运行函数的参数,线程的限制 (一般为 NULL)
*/
返回值:
- 若线程创建成功,则返回0
- 若线程创建失败,则返回出错编号
pthread_create(
<#pthread_t *restrict#>, // pthread_t :线程标识符.
<#const pthread_attr_t *restrict#>,
<#void *(*)(void *)#>,
<#void *restrict#>
);
4.2.2 __bridge 桥接
__bridge 桥接:
1、在c语言和OC之间,对数据类型进行转成换
2、通过桥接告诉c语言的函数,name就由C语言去管了```
桥接的目的 :
就是为了告诉编译器如何管理内存,为OC添加自动内存管理操作
小结 :
-
在 C 语言中,没有对象的概念,对象是以结构体的方式来实现的
-
通常,在 C 语言框架中,对象类型以 _t/Ref 结尾,而且声明时不需要使用 *
-
C 语言中的 void * 和 OC 中的 id 是等价的
-
在混合开发时,如果在 C 和 OC 之间传递数据,需要使用 __bridge 进行桥接,
-
桥接的添加可以借助 Xcode 的辅助功能添加
```objc
number = 1: 表示 主线程
number != 1: 表示 子线程
C语言中 void * == OC中的id
C语言的数据类型,一般以 Ref / _t
- OC框架 Foundation
- C语言 Core Foundation
NSString *str1 = @"1111";
CFStringRef str2 = (__bridge CFStringRef)(str1);
CFRelease(str2);
NSArray *array = nil;
CFArrayRef arr = (__bridge CFArrayRef)(array);
NSDictionary *dict = [NSDictionary dictionary];
CFDictionaryRef cfdict = (__bridge CFDictionaryRef)(dict);
CFRelease(cfdict);
4.2.3 pthread的使用
首先导入头文件
#import <pthread.h>
代码创建:
// 创建线程,并且在线程中执行 demo 函数
- (void)pthreadDemo {
pthread_t threadId = NULL;
NSString *str = @"Hello Pthread";
int result = pthread_create(&threadId, NULL, demo, (__bridge void *)(str));
if (result == 0) {
NSLog(@"创建线程 OK");
} else {
NSLog(@"创建线程失败 %d", result);
}
}
// 后台线程调用函数
void *demo(void *params) {
NSString *str = (__bridge NSString *)(params);
NSLog(@"%@ - %@", [NSThread currentThread], str);
return NULL;
}
作者:蓝田(Loto)
出处: 简书
如果你觉得本篇文章对你有所帮助,请点击文章末尾下方“喜欢”
如有疑问,请通过以下方式交流:
① 评论区回复
② 微信(加好友请注明“简书+称呼”)
③发送邮件
至 shorfng@126.com
本文版权归作者和本网站共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接。
网友评论