pthread(現(xiàn)在幾乎不用了)
pthread 是 POSIX 多線程開發(fā)框架,由于是跨平臺(tái)的 C 語言框架。
pthread代碼示例
// 創(chuàng)建線程,并且在線程中執(zhí)行 demo 函數(shù)
- (void)pthreadDemo {
/**
參數(shù):
1> 指向線程標(biāo)識(shí)符的指針,C 語言中類型的結(jié)尾通常 _t/Ref,而且不需要使用 *
2> 用來設(shè)置線程屬性
3> 線程運(yùn)行函數(shù)的起始地址
4> 運(yùn)行函數(shù)的參數(shù)
返回值:
- 若線程創(chuàng)建成功,則返回0
- 若線程創(chuàng)建失敗,則返回出錯(cuò)編號(hào)
*/
pthread_t threadId = NULL;
NSString *str = @"Hello Pthread";
// 這邊的demo函數(shù)名作為第三個(gè)參數(shù)寫在這里可以在其前面加一個(gè)&,也可以不加,因?yàn)楹瘮?shù)名就代表了函數(shù)的地址。
int result = pthread_create(&threadId, NULL, demo, (__bridge void *)(str));
if (result == 0) {
NSLog(@"創(chuàng)建線程 OK");
} else {
NSLog(@"創(chuàng)建線程失敗 %d", result);
}
// pthread_detach:設(shè)置子線程的狀態(tài)設(shè)置為detached,則該線程運(yùn)行結(jié)束后會(huì)自動(dòng)釋放所有資源。
pthread_detach(threadId);
}
// 后臺(tái)線程調(diào)用函數(shù)
void *demo(void *params) {
NSString *str = (__bridge NSString *)(params);
NSLog(@"%@ - %@", [NSThread currentThread], str);
return NULL;
}
小結(jié)
- 在c語言中,沒有對(duì)象的概念,對(duì)象類型是以
-t/Ref結(jié)尾的,并且聲明的似乎不需要用*。 - c語言中的void * 和OC的id是等價(jià)的。
- 內(nèi)存管理
- 在 OC 中,如果是 ARC 開發(fā),編譯器會(huì)在編譯時(shí),根據(jù)代碼結(jié)構(gòu), 自動(dòng)添加
retain/release/autorelease。 - 但是,ARC 只負(fù)責(zé)管理 OC 部分的內(nèi)存管理,而不負(fù)責(zé) C 語言 代碼的內(nèi)存管理。
- 因此,開發(fā)過程中,如果使用的 C 語言框架出現(xiàn)
retain/create/copy/new等字樣的函數(shù),大多都需要release,否則會(huì)出現(xiàn)內(nèi)存泄漏。
- 在混合開發(fā)時(shí),如果在 C 和 OC 之間傳遞數(shù)據(jù),需要使用
__bridge進(jìn)行橋接,橋接的目的就是為了告訴編譯器如何管理內(nèi)存。 - 橋接的添加可以借助 Xcode 的輔助功能添加。
- MRC 中不需要使用橋接。