国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 學(xué)院 > 開發(fā)設(shè)計 > 正文

iOS中的自由橋接

2019-11-14 18:19:34
字體:
供稿:網(wǎng)友

摘抄自《iOS 6編程實戰(zhàn)》】

  與Objective-C庫不同,我們在Objective-C中使用標(biāo)準(zhǔn)C語言和Core Foundation類庫(CF*方法)不會遵循那些命名約定。這意味著ARC編譯器無法百分百地釋放不需要的內(nèi)存。在ARC出現(xiàn)之前,我們可以將CF* 對象強制轉(zhuǎn)換成NS*對象,這稱為自由橋接(toll-free bridging)。也就是說,我們可以將CFString*通過類型轉(zhuǎn)換變成NSString*類型。而有了ARC,我們便無法再這么做了,至少不指定 一個所有權(quán)轉(zhuǎn)移修飾符時確實如此。

  ARC允許使用以下這些所有權(quán)轉(zhuǎn)移修飾符:__bridge、__bridge_retained、__bridge_transfer

1、__bridge

  第一個修飾符__bridge是一個普通的轉(zhuǎn)換,它告訴ARC不要增加它的引用計數(shù)的值,也不要更改所有權(quán)。LLVM的設(shè)計師并沒有讓 __bridge成為默認所有權(quán)轉(zhuǎn)移修飾符,因為做這樣的決定過于大膽了。Core Foundation方法沒有一個合適的命名約定,所以在沒有明確指定一個所有權(quán)轉(zhuǎn)移修飾符的情況下,編譯器對于如何轉(zhuǎn)移一個C指針類型的所有權(quán)無法錯處 有把握的決定。

2、__bridge_retained

  若想要轉(zhuǎn)換C指針類型并增加引用計數(shù)的值,我們可以使用第二個修飾符。當(dāng)要從Objective-C方法(它創(chuàng)建一個Core Foundation對象并在之后使用CFRelease方法將其釋放)返回一個保留過的指針時,我們可以使用這個修飾符。如果Objective-C方 法屬于NSRETURNS_RETAINED系列,就要返回保留過的指針。

3、__bridge_transfer

  如果要將Core Foundation指針類型轉(zhuǎn)換成Objective-C指針并為引用計數(shù)加1,可以使用最后一個修飾符。若Core Foundation方法創(chuàng)建一個對象,并且想要靠ARC來管理對象的內(nèi)存,我們便可以使用這個修飾符。本質(zhì)上,我們是“轉(zhuǎn)移”了所有權(quán)給ARC。

 
 
 //NSString *str = @"123"; // Foundation
//CFStringRef str2 = (__bridge CFStringRef)str; // Core Foundation
//NSString *str3 = (__bridge NSString *)str2;

//    CFArrayRef ---- NSArray
//    CFDictionaryRef ---- NSDictionary
//    CFNumberRef ---- NSNumber

// Core Foundation中手動創(chuàng)建的數(shù)據(jù)類型,都需要手動釋放
//    CFArrayRef array = CFArrayCreate(NULL, NULL, 10, NULL);
//    CFRelease(array);
//
//
//    CGPathRef path = CGPathCreateMutable();
//    CGPathRetain(path);
//
//    CGPathRelease(path);
//    CGPathRelease(path);
/**
 凡是函數(shù)名中帶有create/copy/new/retain等字眼, 都應(yīng)該在不需要使用這個數(shù)據(jù)的時候進行release
 GCD的數(shù)據(jù)類型在ARC環(huán)境下不需要再做release
 CF(Core Foundation)的數(shù)據(jù)類型在ARC/MRC環(huán)境下都需要再做release
 */
 

發(fā)表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發(fā)表
主站蜘蛛池模板: 玛多县| 韩城市| 忻城县| 龙门县| 抚顺市| 罗甸县| 英山县| 昌乐县| 丰台区| 巴中市| 襄垣县| 双鸭山市| 盐津县| 香港 | 吉林市| 横峰县| 庆云县| 卓资县| 临猗县| 原平市| 获嘉县| 石楼县| 宁波市| 天水市| 海晏县| 鄂托克前旗| 宣威市| 肥城市| 赞皇县| 雅安市| 全州县| 安龙县| 玛多县| 贵州省| 绥阳县| 巴彦淖尔市| 长子县| 九龙坡区| 玉山县| 枣庄市| 班玛县|