NSDictionary
ключи копируются при установке. В коде dictionary[key] = value
объект key
копируется, а словарь сохраняет копию. Объект value
не копируется; вызывающая сторона и словарь имеют ссылку на один и тот же объект.
При извлечении ключей или объекта копирование не производится. dictionary.allKeys
возвращает массив ключевых объектов в словаре, а не копии. Аналогично, dictionary[key]
возвращает ссылку на значение для key
в словаре.
И, как вы знаете, @property (copy)
применяется только при установке значения. Получатели ObjC никогда не копируют объекты, если это специально не задокументировано или вы не пишете свои собственные.
Точно так же, чтобы ответить на ваш вопрос, метод ключ-значение использует те же правила, лежащие в основе этого свойства. Таким образом, -setValue:forKey:
, -setValue:forKeyPath:
, -valueForKey:
, -valueForKeyPath:
и т. Д. Получат или установят правильное значение, как если бы вы обращались к свойству напрямую. Другими словами, если значение копируется, когда свойство установлено, -setValue:forKeyPath:
скопирует значение. Если средство доступа не копирует значение, то -valueForKey:
не будет копировать значение.