Свойства - это просто удобный способ доступа к данным.Поэтому, когда вы объявляете свойство @property (nonatomic, retain) SomeType * someObject;это означает, что во время доступа будет синтезировано 2 метода:
getter:
-(SomeType*) someObject {
return someObject;
}
setter
-(void) setSomeObject:(SomeType*) obj {
[someObject release];
someObject = [obj retain];
}
Таким образом, основное различие между свойствами и ivars заключается в том, что свойствадинамическое создание методов установки / получения (и вы можете переопределить их).Но когда вы пишете someObject = new_val, вы просто копируете ссылку на ячейку памяти.Никакой дополнительной работы там не сделано, кроме одной инструкции по сборке.
Следует упомянуть еще одну вещь: атомарную и неатомную.С атомарным, синтезированный установщик / получатель будет гарантировать, что целое значение всегда возвращается из получателя или устанавливается установщиком, независимо от активности установщика в любом другом потоке.То есть, если поток A находится в середине метода получения, а поток B вызывает метод установки, фактическое жизнеспособное значение - объект с автоматически освобожденным кодом, скорее всего, - будет возвращено вызывающей стороне в A.
Inнеатомные, такие гарантии не предоставляются.Таким образом, nonatomic значительно быстрее, чем atomic.
Редактировать: поэтому, если у вас есть некоторая переменная, доступ к которой осуществляется из разных потоков или / и необходимо выполнить некоторую дополнительную работу (например, сохранить, поднять некоторые флаги ...), то ваш выбор - собственность.Но иногда у вас есть переменная, к которой очень часто обращаются, и доступ через свойство может привести к большим накладным расходам, потому что процессору приходится выполнять гораздо больше операций для синтеза и вызова метода.