Подтвердить что ты не робот

Какая разница между изменчивыми и неизменяемыми

какая разница изменчива и неизменна

как

NSString и NSMutableString.

NSArray и NSMutableArray.

NSDictionary и NSMutableDictionary.

В чем разница между изменяемым объектом и другим объектом [который я считаю неизменным]

@thanks заранее.

4b9b3361

Ответ 1

Изменчивый объект может быть изменен или изменен. Неизменный объект не может. Например, хотя вы можете добавлять или удалять объекты из NSMutableArray, вы не можете делать ни с NSArray.

Объекты Mutable могут иметь элементы, которые изменяются, добавляются или удаляются, что не может быть достигнуто с неизменяемыми объектами. Неизменяемые объекты застревают независимо от того, что вы дали им в инициализаторе [[object alloc] initWith...].

Преимущества ваших изменяемых объектов очевидны, но их следует использовать только при необходимости (что намного реже, чем вы думаете), поскольку они занимают больше памяти, чем неизменяемые объекты.

Ответ 2

Изменчивые объекты могут быть изменены, неизменные объекты не могут.

Например: NSMutableArray имеет методы addObject: removeObject: (и более), но NSArray не делает.

Изменение строк:

NSString *myString = @"hello";
myString = [myString stringByAppendingString:@" world"];

против

NSMutableString *myString = @"hello";
[myString appendString:@" world"];

Переменные объекты особенно полезны при работе с массивами,

Например, если у вас есть NSArray из NSMutableStrings, вы можете сделать:

[myArray makeObjectsPerformSelector:@selector(appendString:) withObject:@"!!!"];

который добавит 3! до конца каждой строки в массиве.

Но если у вас NSArray из NSStrings (поэтому неизменяемый), вы не можете сделать этого (по крайней мере, это намного сложнее и больше кода, чем использование NSMutableString)

Ответ 3

Изменчивый объект может быть изменен или изменен. Неизменный объект не может. Например, хотя вы можете добавлять или удалять объекты из NSMutableArray, вы не можете делать ни с NSArray.

Ответ 4

Основное отличие:

  • NSStrings нельзя редактировать, только переназначать. Это означает, что когда значение NSString изменяется, оно фактически указывает на новое местоположение в памяти.

  • Объекты NSMutableString можно редактировать и поддерживать один и тот же указатель.

Общая практическая разница:

  • Если вы создаете 1 NSString и затем назначаете ей еще одну, отредактируйте одну из них, теперь они будут указывать на разные строки.

  • Если вы делаете то же самое с NSMutableStrings, но затем просто редактируете один из них (не переназначайте его), они оба будут указывать на недавно отредактированный объект.

Ответ 5

Английское определение " mutable" действительно все, что вам нужно здесь. Измененные объекты могут быть изменены после создания. Неизменяемые объекты не могут быть изменены после создания. Это относится ко всем перечисленным вами классам.

Практически говоря, все изменчивые классы являются подклассами неизменяемых и каждый добавляет свой собственный интерфейс, чтобы позволить программную модификацию объекта, например addObject:, setObject:forKey: и т.д.

Ответ 6

Все говорят, что вы не можете изменить/изменить объект неизменяемый. У меня есть другой способ объяснить. Вы можете изменить его, но тогда вы создадите указатель new для нового объекта, его не так, как вы изменили старый объект, его бренд. Новый. Объект. Любой указатель, который ранее указывал указатель на него, не видел его изменения. Однако, если его Mutable Object, любой ранее указывающий ему объект будет видеть его значение new. См. Примеры. FYI %p печатает местоположение указателя в куче.

 NSString * A = @"Bob";
    NSString * B = @"Bob";
    NSString * C = @"Bob1";
    NSString * D = A;
    NSLog(@"\n %p for A \n %p for B \n %p for C \n %p for D",A,B,C,D);

    // memory location of A,B,D are same.

0x104129068 для
0x104129068 для B
 0x104129088 для
0x104129068 для D


Изменение указателя Объект

A = @"Bob2"; // this would create a new memory location for A, its previous memory location is still retained by B
NSLog(@"\n%p for A \n%p for B \n%p for C \n %p for D",A,B,C, D);

// A has a **new** memory location, B,D have same memory location.

0x1041290c8 для
0x104129068 для B
0x104129088 для
0x104129068 для D


// NSMutableString * AA = @"Bob"; <-- you CAN'T do this you will get error: Incompatible pointer types initializing NSMutableString with an Expression of type NSString
    NSMutableString * AA = [NSMutableString stringWithString:@"Bob1"];
    NSString * BB = @"Bob";
    NSString * CC = @"Bob1";
    NSString * DD = AA;
    NSLog(@"\n %p for AA \n %p for BB \n %p for CC \n %p for DD",AA,BB,CC,DD);

    // memory location of AA,DD are same.

0x7ff26af14490 для AA
0x104129068 для BB
 0x104129088 для CC
0x7ff26af14490 для DD


Изменение объекта указателя AA

  AA = (NSMutableString*)@"Bob3"; // This would NOT create a new memory location for A since its Mutable-- D was and still pointing to some location
    NSLog(@"\n%p for AA \n%p for BB \n%p for CC \n %p for D",AA,BB,CC,DD);

    // memory location of AA,DD are NOT same.

0x104129128 для AA
0x104129068 для BB
0x104129088 для CC
0x7ff26af14490 для DD

Как вы думаете, атрибут хранения по умолчанию для всех свойств NSString - retain. Для получения дополнительной информации о copy и retain, я настоятельно рекомендую вам прочитать этот вопрос. Свойство NSString: скопировать или сохранить?

Ответ 7

Mutable может быть изменен, неизменный не может. Когда вы делитесь изменяемыми объектами, вы должны ожидать, что кто-то может его изменить. Когда вы делитесь неизменным объектом, вы ожидали, что никто не изменится.

Ответ 8

Есть несколько других различий, которые интересны неизменяемому объекту при копировании, вместо этого будут сохранены. Также может быть много под различиями капота, которые яблоко реализует по соображениям производительности, зависит от того, изменен ли объект или нет, например, методы подстроки копируют фактические байты их родительской строки или просто определяют поддиапазон родительская строка, если она является неизменной, вероятно, но кто знает.