#objective-c #properties #getter-setter #assign
#objective-c #свойства #получатель-установщик #назначить
Вопрос:
Проверяет ли реализация установщика сначала, отличается ли новое значение от старого значения, прежде чем присваивать ivar новому значению?
Существует ли документация (или исходный код), которая показывает все различные перестановки (в зависимости от атрибутов, assign
, retain
и т.д.) того, Как синтезируется свойство?
Ответ №1:
Я не могу представить, чтобы установщик assign сначала проверял предыдущие значения. Это было бы пустой тратой циклов процессора, поскольку результат будет одинаковым в любом случае. В документации явно указана семантика различных атрибутов, но не показано, какой именно код синтезируется.
Комментарии:
1. Разве это не сэкономило бы циклы процессора в случае, если новое значение равно старому значению, потому что тогда процессору не нужно тратить циклы на сброс переменной экземпляра до нового значения?
2. @MattDiPasquale, в случае, если они совпадают, да, вы бы сохранили присвоение переменной, но предварительно заплатили бы за условную проверку. В (наиболее распространенном) случае, когда значения разные, вы теперь платите за условное условие и присвоение, нанося больше вреда, чем пользы.
3. @Matt Быстрее всего просто установить его (
load>mov
) , а неload>load>compare>(branch ? mov : nop)
. С atomics это еще сложнее. Сравнение целесообразно, когда операция является более значимой (например, сохраненное или скопированное свойство). псевдо-asm.
Ответ №2:
Документация Objective-C объясняет это. Детали того, что на самом деле происходит, зависят от конкретной реализации.
Копировать
Указывает, что для назначения должна использоваться копия объекта. Предыдущее значение отправляется сообщением об освобождении. Копирование выполняется путем вызова метода copy . Этот атрибут действителен только для типов объектов, которые должны реализовывать протокол NSCopying.назначить
Указывает, что установщик использует простое присвоение. Этот атрибут используется по умолчанию. Вы используете этот атрибут для скалярных типов, таких как NSInteger и CGRect .сохранить
Указывает, что сохранение должно вызываться для объекта при назначении. Предыдущее значение отправляется сообщением об освобождении.
…
неатомный
Указывает, что средства доступа являются неатомными. По умолчанию средства доступа являются атомарными.
…
[_internal lock]; // lock using an object-level lock
id result = [[value retain] autorelease];
[_internal unlock];
return resu<