僅討論ARC環境下:
1. weak是弱引用,不會持有對象,引用計數器不會+1
常用于修飾UI控件、delegate
聲明為weak的指針,weak指針指向的對象一旦被釋放,weak的指針都將被賦值為nil,防止野指針。
2. strong是強引用,會持有對象,引用計數器會+1
修飾:OC對象
3.assign簡單賦值,不改變引用計數。
修飾:
①基礎數據類型(NSInteger、CGFloat)
②C數據類型(int、float、double、char等)
③枚舉、結構體等非OC對象
4. copy分為淺拷貝、深拷貝。
修飾NSString、block
block如果不copy的話,block是存放在棧里面的,他的生命周期會隨著函數的結束而出棧的,copy之后會放在堆里面。
蘋果對copy的原則,蘋果設定深拷貝和淺拷貝的目的就是希望幫助開發者再使用復制出來的對象時,能夠不影響原對象。
1.png
2.png
3.png
4.png
628887-38df4050c1bcab9f.png總結為:
①不可變對象用copy,生成不可變對象,淺拷貝(指針拷貝)
②不可變對象用mutableCopy,生成可變對象,深拷貝(內容拷貝)
③可變對象用copy,生成不可變對象,深拷貝(內容拷貝)
④可變對象用mutableCopy,生成可變對象,深拷貝(內容拷貝)即:
對于不可變對象來說,copy是淺拷貝,mutableCopy是深拷貝。
對于可變對象來說,copy和mutableCopy都是深拷貝,但copy出來的對象是不可變的,mutableCopy出來的對象是可變的。
- 注意:自定義對象想要擁有拷貝功能,得自己遵循NSCopying方法,并重寫copyWithZone方法。
-(id)copyWithZone:(NSZone *)zone
{
Car *car = [[Car allocWithZone:zone] init];
car.name = self.name;
car.speed = self.speed;
return car;
}
補充:
關于NSArray的修飾,是使用strong還是copy。
NSMutableArray使用strong修飾的。NSArray通常我也是用strong修飾的,網上看到有人說:用strong修飾NSArray,若遇到可變數組給他賦值,會出現BUG。下面看測試:
strong&NSArray.png
如上面代碼所示,self.array1在沒有直接被操作的情況下,跟隨self.mArray2變化了。所以有人提出用copy修飾NSArray,如下代碼:
copy&NSArray.png
上面代碼說明copy修飾NSArray,可以解決可變數組給他賦值帶來的問題。我暫時也沒發現這樣有什么問題,但是前面我說我通常是用strong來修飾NSArray的,下面是我處理方法:
所以說,我用strong來修飾NSArray時,遇到可變數組賦值也不會出什么問題,在不可變數組賦值的時候用copy即可。So,我感覺這是代碼習慣的問題。