淺談——名詞strong咽斧、weak堪置、assign、copy收厨,并比較不同
- strong 表示指向并擁有該對象晋柱。其修飾的對象引用計數(shù)會增加1。該對象只要引用計數(shù)不為0則不會被銷毀诵叁。當(dāng)然強行設(shè)置為nil可以銷毀她
- weak 表示指向但不擁有該對象雁竞。其修飾的對象引用計數(shù)不會增加。無需手動設(shè)置拧额,該對象會自行在內(nèi)存中銷毀碑诉。
- assign 主要用于修飾基本數(shù)據(jù)類型侥锦,如NSInteger和CGFloat进栽,這些數(shù)值主要存在于棧中。
- copy copy與strong類似恭垦。不同之處是strong的復(fù)制是多個指針指向同一個地址快毛,而copy的復(fù)制每次會在內(nèi)存中拷貝一份對象,指針指向不同的地址番挺。copy一般用在修飾有可變對應(yīng)類型的不可變對象上唠帝,如NSString、NSArray玄柏、NSDictionary襟衰。
- weak與assign weak一般用來修飾對象,assign一般用來修飾基本數(shù)據(jù)類型粪摘。原因是assign修飾的對象被釋放后瀑晒,指針的地址依然存在绍坝,造成野指針,在堆上容易造成崩潰苔悦,而在棧上的內(nèi)存系統(tǒng)會自動處理轩褐,不會造成野指針。
- Objective-C中间坐,基本數(shù)據(jù)類型的默認(rèn)關(guān)鍵字是atomic灾挨、readwrite、assign竹宋;普通屬性的默認(rèn)關(guān)鍵字是atomic劳澄、readwrite、strong蜈七。
淺談—— readwrite秒拔、readonly
- readwrite (默認(rèn)值):表示其同時擁有g(shù)etter和setter方法
- readonly:只讀操作,其只有g(shù)etter方法飒硅,沒有setter方法
注:如果某個實例只允許被外部讀取砂缩,而不能寫入操作,同時在類實現(xiàn)文件當(dāng)中可以寫入的話三娩,可以在頭文件中聲明屬性為只讀的庵芭,在實現(xiàn)文件中設(shè)置其為可讀寫的屬性,寫法如下:
//頭文件中聲明為:
@property(nonatomic,readonly,copy) NSString *stringA;
//實現(xiàn)文件中聲明為:
@property(nonatomic,readwrite,copy) NSString *stringA;
淺談——__weak雀监、__block
- __weak 和weak基本相同双吆,前者用于修飾變量,后者用于修飾屬性会前。代碼中__weak主要是為防止Block中的循環(huán)引用好乐。
- __blcok也用于修飾變量,他是引用修飾瓦宜,所以其修飾的值是動態(tài)變化的蔚万,即可以被重新賦值的。__block 用于修飾某些Block內(nèi)部將要修飾的外部變量临庇。
- __weak 和 __block的使用場景幾乎和Block息息相關(guān)反璃。而所謂Block,就是objective-c對于閉包的實現(xiàn)假夺,閉包就是沒有名字的函數(shù)淮蜈,或者理解為指向函數(shù)的指針。
淺談——atomic侄泽、nonatomic
- atomic 修飾的對象會保證setter和getter的完整性,任何線程對其訪問都可以得到一個完整的初始化的對象蜻韭,欣慰要保證操作完成悼尾,所以速度慢柿扣,它比nonatomic安全,但并不是絕對的線程安全闺魏,例如多個線程同時調(diào)用set和get就會導(dǎo)致獲得的對象值不一樣未状。想要絕對的線程安全,就要用synchronized析桥。
- nonatomic修飾的對象不保證setter和getter的完整性司草,所以多個線程訪問,它可能回返回未初始化的對象泡仗。正因為如此埋虹,它比atomic快,但線程也是不安全的娩怎。
最后編輯于 :
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者