2015-12-05 2 views
0

Предположим, у меня есть тип 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. В чем причина этого различного поведения, один не обновляется, а другой обновляется соответственно, когда есть изменения?

+0

Ваши примеры совершенно разные. С массивами вы присваиваете 'array1'' array2' после того, как вы измените 'array1'. Но с помощью строк вы назначаете 'string1'' 'string2' перед изменением' string1'. – rmaddy

+0

Не следует: 'NSString __strong ** string2 = & string1;', это просто вызывает путаницу и подрывает объекты Objective-C. – zaph

ответ

3

В примере с вашими строками обе переменные указывают на то же место в памяти. Но когда вы делаете

string1 = @"hello world(changed)"; 

Вы не выполняете никаких действий над строкой1. Вместо этого ваш указатель string1 теперь указывает на вновь созданный объект.

Принимая во внимание, что в вашем примере массивов вы выполнили действие над объектом массива, на которое по-прежнему указываются оба указателя.

В вашем втором примере, если вы делаете что-то вроде

array2 = @[@"new array"]; 

Оба указателя теперь указывают на 2-х различных объектов.

+1

да ваше объяснение разрешает мою головоломку, спасибо. –

1

%p Используйте для входа string1 как:

NSLog(@"string 1: %p", string1); 

вы увидите адрес памяти string1 изменился до и после. Попробуйте на вашем array тоже.

Смежные вопросы