strong和copy是常用到的修飾符,那麼什麼時候用strong,什麼時候用copy,先上一段代碼再說(以下代碼直接在ViewController中寫); 先定義兩個數組 viewDidLoad方法 列印結果 再來看下三個數組指向的記憶體地址: 可以看到arraystrong隨著arrayMut的改 ...
strong和copy是常用到的修飾符,那麼什麼時候用strong,什麼時候用copy,先上一段代碼再說(以下代碼直接在ViewController中寫);
先定義兩個數組
///strong @property (nonatomic,strong) NSArray *arraystrong; ///copy @property (nonatomic,copy) NSArray *arraycopy;
viewDidLoad方法
- (void)viewDidLoad { [super viewDidLoad]; NSMutableArray *arrayMut = [NSMutableArray array]; ///先添加一個字元串 [arrayMut addObject:@"xiaogui1"]; self.arraystrong = arrayMut; self.arraycopy = arrayMut; ///再添加一個字元串 [arrayMut addObject:@"xiaogui2"]; ///內容 NSLog(@"arraystrong=%@\narraycopy%@\n",self.arraystrong,self.arraycopy); ///地址 NSLog(@"\n\n記憶體地址:\n\narrayMut 地址:%p\narraystrong 地址:%p\narraycopy 地址:%p\n",arrayMut,self.arraystrong,self.arraycopy); }
列印結果
再來看下三個數組指向的記憶體地址:
可以看到arraystrong隨著arrayMut的改變而改變了,而arraycopy沒有隨著arrayMut的改變而改變;原因是因為用strong來修飾時,賦值時並沒有創建新的空間,由列印的地址可以看到指向的是同一個指針的記憶體空間,而用copy時,創建了新的記憶體空間,沒有和arrayMut指向同一個地址; 但是還有一個問題,往 ↓ 看:
當我把self改成下劃線_去引用變數時:
- (void)viewDidLoad { [super viewDidLoad]; NSMutableArray *arrayMut = [NSMutableArray array]; ///先添加一個字元串 [arrayMut addObject:@"xiaogui1"]; ///把self改成_ _arraystrong = arrayMut; _arraycopy = arrayMut; ///再添加一個字元串 [arrayMut addObject:@"xiaogui2"]; NSLog(@"arraystrong=%@\narraycopy%@",self.arraystrong,self.arraycopy); }
列印結果:
這是因為用self引用時,調用了自身的get set方法,也就是因為這樣,才實現了strong和copy的不同,而直接用_是沒有執行get set 方法的,所以兩個數組的值是一樣的;所以一般在項目中,全部使用self比較好,個人認為,有誤還請指出。