Не могу понять геттер / сеттер с объектом

Легко понять концепцию метода установки / получения для простых данных, например 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), которое доступно вне объекта-владельца, почти всегда является плохой идеей. Как только вы это сделаете, становится слишком легко иметь несколько объектов, пытающихся внести свои собственные изменения и растоптать друг друга.

Настройка действительно относится только к инициализации. Вот почему атомарности недостаточно, чтобы гарантировать, что изменяемые структуры данных являются поточно-ориентированными. Вместо этого вы получаете гарантию, что объект будет заменен или прочитан одним махом, так что вы не получите частичных назначений.

Другие вопросы по тегам