Не могу понять геттер / сеттер с объектом
Легко понять концепцию метода установки / получения для простых данных, например NSInteger.
Если мы говорим: NSInteger a;
Установщик для "a" изменяет значение a, а получатель только получает (возвращает) его значение. Тогда легко понять атомарную / неантомическую концепцию, поскольку atomic гарантирует, что чтение "a" во время изменения a всегда будет возвращать целое значение (геттер и сеттер синхронизированы).
Но я не совсем понимаю, что это setter и getter для свойств, которые являются указателями на объекты (например, NSData*, NSString*). Скажем, например, NSMutableData:
Если мы скажем: NSMutableData *m_my_mutable;
Представьте, что у меня есть сеттер setMyMutable и getMyMutable для этого свойства, которое принадлежит моему объекту MyObject. Если я сделаю это, то я вызову метод получения (так как я получаю объект до добавления данных):
[[MyObject getMyMutable] appendData....]
но appendingData также изменит его, поэтому разве это не должно рассматриваться как действие сеттера? Или установщик относится только к факту инициализации значения (которое может быть сохранено, например).
Я должен что-то упустить в этой концепции.
Спасибо Apple92
2 ответа
Сеттер устанавливает значение свойства. Когда вы устанавливаете целочисленное свойство, новое целочисленное значение сохраняется. Когда вы устанавливаете свойство объекта, новый объект сохраняется. appendData:
не изменяет свойство - оно изменяет сам объект данных. Атомарное свойство будет только гарантировать, что свойство содержит какое-то полное значение или другое - оно не влияет на то, что вы делаете с объектом внутри свойства.
Между прочим, наличие изменяемого состояния (такого как объект NSMutableData), которое доступно вне объекта-владельца, почти всегда является плохой идеей. Как только вы это сделаете, становится слишком легко иметь несколько объектов, пытающихся внести свои собственные изменения и растоптать друг друга.
Настройка действительно относится только к инициализации. Вот почему атомарности недостаточно, чтобы гарантировать, что изменяемые структуры данных являются поточно-ориентированными. Вместо этого вы получаете гарантию, что объект будет заменен или прочитан одним махом, так что вы не получите частичных назначений.