Вы правы в первом случае, и копирование может быть полезным, поскольку NSString
имеет изменяемый подкласс (NSMutableString
), так copy
гарантирует, что у вас есть в *name
реальной NSString
и не это изменчивый подкласс.
(Подробнее: Говоря о NSString
, copy
используется в основном по свойствам, но в зависимости от того, как структурирован ваш код может быть полезным даже в локальной переменной)
Но во втором случае вы не правы. Первого: вы используете ARC (не упоминается в этой должности, но я вижу тег), так что все локальные переменные являются __strong
по умолчанию
Когда вы делаете:
NSString *name = [dict objectForKey:@"name"]; // use objectForKey since valueForKey is for KVC, as suggested by Martin R
Вы не принимаете ссылку в словарь, но вы делаете ссылку на объект в ключевом «имени» внутри словаря (это должно быть NSString
). Итак, ARC автоматически отправляет сообщение retain
на номер NSString
. В тот момент, что строка сильно по крайней мере ссылается две вещи:
- ваш *name
указатель
- NSDictionary
если ваш словарь высвобождены, экземпляр NSString
имеет другую ссылку (от *name
) и не освобождается, пока эта последняя ссылка не будет удалена.
Последнее: поскольку в вашем примере есть только локальные переменные, все сильные ссылки, созданные здесь, теряются после завершения метода (поскольку локальные переменные уничтожаются). Объекты, на которые ссылаются, освобождаются, если у них нет других сильных ссылок в других частях кода.
@ CodenameLambda1 Нет, он не прав, я пишу ответ – LombaX
Обратите внимание, что 'objectForKey:' является основным методом для получения значений словаря. 'valueForKey:' используется только для магии кодирования ключа. –
@MartinR вы правы, я добавил его в свой ответ (с «credit» :-) – LombaX