Post

iOS - pthread 使用和 __bridge

iOS - pthread 使用和 __bridge

pthread是POSIX thread的简写,跨平台多线程的C语言开发框架,pthread是实现多线程的技术方案之一,NSThread就是对它的封装。

pthread开启子线程的函数介绍

1
2
3
#import <pthread.h>
int pthread_create(pthread_t * __restrict, const pthread_attr_t * __restrict,
				   void *(*)(void *), void * __restrict);

参数

pthread_t * : 线程标示符,传入指向线程标示符的指针地址。 pthread_attr_t * :线程属性,传入指向线程属性的指针地。 void*( * )(void * ) :新线程要执行的函数(任务),传入函数地址,即函数名。 void * :传入到函数的参数。

返回值

  • 返回int类型的值,0表示创建新线程成功,反之,创建新线程失败,返回失败的编号。
  • C语言框架里面并不是非零即真原则;因为他们认为成功的结果只有一个,但是失败的原因有很多。

pthread开启子线程的函数实现

1
2
3
4
5
6
7
8
9
10
11
12
- (void)pthreadDemo {
	// 新线程的标示符
	pthread_t ID;
	// 创建子线程
	int result = pthread_create(&ID, NULL, demo, NULL);
	// 判断创建子线程是否成功
	if (result == 0) {
		NSLog(@“success);
	} else {
		NSLog(@“failure);
	}
}

子线程异步执行的函数/任务

1
2
3
4
5
void * demo(void *param)
{
	NSLog(@"demo %@",[NSThread currentThread]);
	return NULL;
}

小结

  • C 语言中 void * 与 OC 中的 id 类似。
  •  void *(*)(void *) 中的(*) 表示指向函数的指针,即函数指针,即函数名或者函数地址。

__bridge

用作于普通的 C 指针与 OC 指针的转换,不做任何操作。

1
2
3
void *p;
NSObject *objc = [[NSObject alloc] init];
p = (__bridge void*)objc;

这里的 void * p 指针直接指向了 NSObject * objc 这个 OC 类,p 指针并不拥有 OC 对象,跟普通的指针指向地址无疑。所以这个出现了一个问题,OC 对象被释放,p 指针也就释放了。

__bridge_retained

用作 C 指针与 OC 指针的转换,并且也用拥有着被转换对象的所有权

__bridge_transfer

用作 C 指针与 OC 指针的转换,并在拥有对象所有权后将原先对象所有权释放。(只支持 C 指针转换 OC 对象指针) 其实可以理解为先将对象的引用计数器 +1,然后再将引用计数器 -1。

This post is licensed under CC BY 4.0 by the author.