Предположим, у меня есть тип NSString string1 и string2, string2 был назначен как строка2 = строка1. Если string1 был обновлен с каким-либо другим значением, строка2 НЕ ДОЛЖНА соответственно.Почему изменения NSString и NSMutableArray отличаются друг от друга?
NSString *string1 = @"hello world";
NSString *string2 = string1;
NSLog(@"string 1: %@", string1);
NSLog(@"string 2: %@", string2);
NSLog(@"===================");
string1 = @"hello world(changed)";
NSLog(@"string 1: %@", string1);
NSLog(@"string 2: %@", string2);
Однако, если у меня есть тип NSMutableArray array1 и array2, array2 был назначен array2 = array1. Если array1 был обновлен с некоторыми другими значениями, соответственно изменилось array2 WAS.
NSMutableArray *array1 = [NSMutableArray new];
NSMutableArray *array2 = [NSMutableArray new];
[array1 addObject:@"hello"];
array2 = array1;
NSLog(@"array 1: %@", array1);
NSLog(@"array 2: %@", array2);
NSLog(@"===================");
[array2 addObject:@"world"];
NSLog(@"array 1: %@", array1);
NSLog(@"array 2: %@", array2);
Я знаю, что для случая NSString, если я хочу, чтобы string1 и string2 всегда то же самое, что я могу сделать string2 в качестве точки указатель на string1, NSString __strong **string2= &string1;
и для случая NSMutableArray я могу использовать array2 = [array1 copy]
, если я не хочу array2 всегда будет таким же, как array1.
Но мой вопрос в том, что, по моему мнению, они являются как объектным типом, так и подклассом NSObject. В чем причина этого различного поведения, один не обновляется, а другой обновляется соответственно, когда есть изменения?
Ваши примеры совершенно разные. С массивами вы присваиваете 'array1'' array2' после того, как вы измените 'array1'. Но с помощью строк вы назначаете 'string1'' 'string2' перед изменением' string1'. – rmaddy
Не следует: 'NSString __strong ** string2 = & string1;', это просто вызывает путаницу и подрывает объекты Objective-C. – zaph