Что делает Mutable Copy в Objective C
В цели C, то же самое для языка C++, если вы назначите объект для объекта, он получит свой указывающий адрес следующим образом:
object1 = object2;
Таким образом, изменение одного из объектов выше повлияет на другой.
Это то же самое для MutableCopy? а в чем разница между копией и MutableCopy?
Как сделать глубокое копирование?
2 ответа
В Objective C
есть другая модель управления памятью, чем в C++
так что вы не можете просто удалить firstString
- вы должны удалить все сильные ссылки на него. В этом случае вы создаете сильную ссылку. Когда вы переназначаете secondString
это будет указывать на другой объект. Так NSString
неизменен.
Изменяемая копия создает еще один строковый объект, и вы можете изменить его
Да, mutableCopy (и копия) является глубокой копией.
см. следующий тестовый код:
- (void)viewDidLoad {
[super viewDidLoad];
// Do any additional setup after loading the view, typically from a nib.
NSString *string1 = @"string1";
NSString *string2 = string1;
NSLog(@"Test 1(%p, %p): String 1: %@; String 2: %@", string1, string2, string1, string2);
string1 = nil;
NSLog(@"Test 2(%p, %p): String 1: %@; String 2: %@", string1, string2, string1, string2);
string1 = string2;
NSLog(@"Test 3(%p, %p): String 1: %@; String 2: %@", string1, string2, string1, string2);
string2 = [string1 mutableCopy];
NSLog(@"Test 4(%p, %p): String 1: %@; String 2: %@", string1, string2, string1, string2);
}
Это производит следующий вывод. Вы можете видеть, что место в памяти одинаково, когда строка2 назначена на строку1. В тесте 4 после mutableCopy расположение памяти изменяется.
2015-04-30 11:07:30.359 TestStuff[9425:2555886] Test 1(0x103021068, 0x103021068): String 1: string1; String 2: string1
2015-04-30 11:07:30.359 TestStuff[9425:2555886] Test 2(0x0, 0x103021068): String 1: (null); String 2: string1
2015-04-30 11:07:30.359 TestStuff[9425:2555886] Test 3(0x103021068, 0x103021068): String 1: string1; String 2: string1
2015-04-30 11:07:30.359 TestStuff[9425:2555886] Test 4(0x103021068, 0x7f9a23d71b30): String 1: string1; String 2: string1