1.static全局變量與普通的全局變量有什么區(qū)別窝革?:
static全局變量只初使化一次,防止在其他源文件中被引用;
2.static局部變量和普通局部變量有什么區(qū)別全释?
static局部變量只被初始化一次,下一次依據(jù)上一次結(jié)果值;
3.static函數(shù)與普通函數(shù)有什么區(qū)別幔托?
static函數(shù)在內(nèi)存中只有一份,普通函數(shù)在每個(gè)被調(diào)用中都維持一份拷貝
4.__bridge蜂挪、__bridge_transfer重挑、__bridge_retained三者之間的區(qū)別。
__bridge:,ARC下編譯器不允許你隱式的將Object-C 指針轉(zhuǎn)換成C指針棠涮,被代入對象的所有者需要明確對象生命周期的管理谬哀,不要出現(xiàn)異常訪問的問題。
id obj = [[NSObject alloc] init];
void *p = (__bridge void *)obj;
__bridge_retained: 將Objective-C對象轉(zhuǎn)換為Core Foundation對象故爵,把對象所有權(quán)橋接給Core Foundation對象玻粪,同時(shí)剝奪ARC的管理權(quán)隅津。告訴ARC 一旦__bridge_retained轉(zhuǎn)換完成,ARC就不用在負(fù)責(zé)釋放該對象了劲室,使用者需要手動(dòng)釋放伦仍,即使用者擁有該對象的持有權(quán)。
d obj = [[NSObject alloc] init];
void *p = (__bridge_retained void *)obj;
非ARC下等價(jià)于
id obj = [[NSObject alloc] init];
void *p = obj;
[(id)p retain];
__bridge_transfer:非Objective-C對象轉(zhuǎn)換為Objective-C對象很洋,同時(shí)將對象的管理權(quán)交給ARC充蓝,開發(fā)者無需手動(dòng)管理內(nèi)存。在類型轉(zhuǎn)換后喉磁,讓其釋放原先所有權(quán)的時(shí)候谓苟,需要使用 __bridge_transfer 關(guān)鍵字,告訴ARC 一旦__bridge_transfer轉(zhuǎn)換完成协怒,ARC要負(fù)責(zé)釋放該對象涝焙!
NSString *aNSString = [[NSString alloc]initWithFormat:@"test"];
CFStringRef aCFString = (__bridge_retained CFStringRef) aNSString;
aNSString = (__bridge_transfer NSString *)aCFString;
可以看出來 __bridge_retained 是替我們做了 retain。剝奪ARC的管理權(quán)
可以看出來 __bridge_transfer 是替我們做了 release孕暇。ARC獲得管理權(quán)
Toll-Free bridged
在iOS世界仑撞,主要有兩種對象:Objective-C 對象和 Core Foundation 對象0。Core Foundation 對象主要是有C語言實(shí)現(xiàn)的 Core Foundation Framework 的對象妖滔,其中也有對象引用計(jì)數(shù)的概念隧哮,只是不是 Cocoa Framework::Foundation Framework 的 retain/release,而是自身的 CFRetain/CFRelease 接口座舍。
這兩種對象間可以互相轉(zhuǎn)換和操作沮翔,不使用ARC的時(shí)候,單純的用C原因的類型轉(zhuǎn)換曲秉,不需要消耗CPU的資源采蚀,所以叫做 Toll-Free bridged。比如 NSArray和CFArrayRef, NSString和CFStringRef岸浑,他們雖然屬于不同的 Framework搏存,但是具有相同的對象結(jié)構(gòu),所以可以用標(biāo)準(zhǔn)C的類型轉(zhuǎn)換矢洲。
http://blog.csdn.net/yiyaaixuexi/article/details/8553659
https://www.cnblogs.com/xinye/p/3168601.html