strong和copy是常用到的修飾符,那麼什麼時候用strong,什麼時候用copy,先上一段代碼再說(以下代碼直接在ViewController中寫); 先定義兩個數組 viewDidLoad方法 列印結果 可以看到arraystrong隨著arrayMut的改變而改變了,而arraycopy沒 ...
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%@",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比較好,個人認為,有誤還請指出。