Синхронизированные изменения объекта Objective-C @ - PullRequest
0 голосов
/ 15 февраля 2012

Мне действительно нравится @ synchronized-construct вместо использования NSLocks, когда я хочу, чтобы структура данных читалась или записывалась только одним потоком за раз. Однако, когда я хочу изменить весь объект, над которым мы @synchronizing, я не уверен, подходит ли @synchronized. Я хочу знать, работают ли они одинаково:

// version 1:

// segment 1:
@synchronized(self.obj) {
    self.obj = obj2;
}
// segment 2:
@synchronized(self.obj) {
    // some other stuff
}

// version 2:
// segment 1:
[objLock lock];
self.obj = obj2;
[objLock unlock];
// segment 2:
[objLock lock];
// some other stuff
[objLock unlock];

Ответы [ 2 ]

1 голос
/ 15 февраля 2012

Вместо этого вы можете установить свойство без nonatomic. Отсутствие nonatomic означает, что это atomic.

Свойства являются атомарными по умолчанию, так что синтезированные методы доступа обеспечивают надежный доступ к свойствам в многопоточной среде, то есть значение, возвращаемое из метода получения или устанавливаемое через установщик, всегда полностью извлекается или устанавливается независимо от того, какие другие потоки выполняются одновременно .

Для получения дополнительной информации см. Документация Apple

0 голосов
/ 15 февраля 2012
Вызовы

A NSLock и @synchronized - это одно и то же, и они в значительной степени взаимозаменяемы.Есть несколько незначительных различий, о которых вам, вероятно, не нужно заботиться о такой простой реализации - но прочитайте их, потому что это довольно интересно!

Здесь есть хороший SO-ответ, который сравниваетдва: Как @synchronized блокировать / разблокировать в Objective-C?

...