Когда Apple впервые представила концепцию свойств, возник большой спор о том, должен ли atomic
или nonatomic
быть значением по умолчанию, и атомщики победили.
Я думаю, что причина в том, что в многопоточной среде, если свойство не является атомарным, вы не можете гарантировать, что указатель, который он возвращает, действителен.Неатомарный метод получения может быть реализован примерно таквремя, чтобы сохранить его.Даже это бесполезно:
-(MyObj*) someProperty
{
return [[someInstVar retain] autorelease];
}
, поскольку какой-то другой поток может освободить someInstVar непосредственно перед увеличением счетчика хранения.
Единственный способ безопасно вернуть указатель в многопоточной среде - это нечтонапример:
-(MyObj*) someProperty
{
@synchronized(self)
{
return [[someInstVar retain] autorelease];
}
}
, а также для синхронизации сеттера.
Однако проблема в том, что блокировка очень дорога (в действительности они использовали что-то намного более легкое, чем @synchronized).но это все еще дорого), так что все в любом случае использовали неатомные и просто сделать все свойства атомарными, в общем, не обеспечивает безопасности потоков, поэтому в любом случае требуются другие методы, и они имеют тенденцию устранять проблему, которую я обсуждал выше.
Многие люди считают, что было принято неправильное решение о том, каким должно быть значение по умолчанию, но его нельзя изменить сейчас для обратной совместимости.Я обнаруживаю, что набираю nonatomic
, даже не задумываясь.