ARC 下
__strong:強引用,持有所指向對象的所有權,無修飾符情況下的默認值.如需強制釋放,可置 nil
__weak:弱引用,不持有所指向對象的所有權,引用指向的對象內存被回收之后,引用本身會置 nil,避免野指針.避免循環(huán)引用,會將對象注冊到 autoreleasepool
unsafe_unretained:相當于 assign.直接賦值.引用計數(shù)不變
屬性的內存管理
assign
直接賦值诉儒,一般用來修飾基本數(shù)據(jù)類型。當然也可以修飾ObjC對象辈末,但是不推薦寄啼,因為被assign修飾的對象釋放后,指針還是指向釋放前的內存蠢挡,在后續(xù)操作中可能會導致內存問題引發(fā)崩潰儒鹿。
retain
retain 和 strong 一樣,都用老修飾 ObjC對象,使用 set方法賦值時,實質上是先保留新增,再釋放舊值,再設置新值,避免新舊值一樣時導致對象唄釋放的問題.
copy
一般用來修飾 String,Dict,Array等需要保護其封裝性的對象,尤其是在其內容可變的情況下,因此會拷貝(深拷貝)一份內容跟屬性使用,避免可能造成的對元內容進行改動.使用 set方法賦值時,實質上是會先拷貝新值,在釋放舊值,再設置新值.實際上,遵守 NSCopying的對象都可以使用 Copy,當然如果你確定要共用同一份可變內容,你也可以使用 strong 或者 retain
weak
ARC新引入修飾詞化撕,可代替assign,比assign多增加一個特性(置nil)约炎。weak和strong一樣用來修飾ObjC對象植阴。使用set方法賦值時,實質上不保留新值圾浅,也不釋放舊值掠手,只設置新值。
strong
ARC新引入修飾詞贱傀,可代替retain惨撇,ARC一般都寫strong。
unsafe_unretained
等價于assign,可以用來修飾數(shù)據(jù)類型和OC對象,但是不會使計數(shù)器加1,且對象銷毀時也不會將對象指向nil,容易造成野指針錯誤府寒。
block的內存管理
如果你使用@property去聲明一個block的時候,一般使用copy來進行修飾(當然也可以不寫报腔,編譯器自動進行copy操作)株搔,盡量不要使用retain。
__weak typeof(self) weakSelf = self;