присваивание собственности с последующим авто-выпуском - PullRequest
4 голосов
/ 18 июля 2011

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

self.prop1 = [[[SomeClass alloc] init] autorelease];

Я думаю, что если раньшеприложение выполняется с помощью функции, в которую вмешивается другой поток, и освобождает prop1, а затем при следующем цикле выполнения указатель, который был инициализирован, потенциально может быть снова освобожден, если prop1 не был установлен равным nil другим потоком.1006 * Я надеюсь, что это имеет смысл для кого-то, и они могут прояснить или снять мое беспокойство.

Ответы [ 2 ]

1 голос
/ 18 июля 2011

Не думаю, что вам нужно беспокоиться о безопасности потоков больше, чем обычно.Писать несколько потоков в одно и то же свойство - это плохо, и этого следует избегать (например, с помощью блокировок).

Вы можете избавиться от автоматического выпуска, используя вместо этого

prop1 = [[SomeClass alloc] init];

, т.е.недвижимость.Я никогда не использую авто-релиз, если в этом нет необходимости, и в этом случае это не так.

0 голосов
/ 19 июля 2011

Это зависит от вашего типа недвижимости. Если вы установите prop1 как Retain / Copy, то вы должны написать так:

@property (nonatomic, retain) id prop1;

if(self.prop1 == nil)
{
   SomeClass *obj = [[SomeClass alloc] init];
   self.prop1 = obj;
   [obj release];
}

если вы установили prop1 как Assign, то

@property (nonatomic, assign) id prop1;
if(self.prop1 == nil)
{
   SomeClass *obj = [[SomeClass alloc] init];
   self.prop1 = [obj retain];
   [obj release];
}

В Deloloc, вы должны пересмотреть prop1, например.

- (void)dealloc
{
  [prop1 release];
  [super dealloc];
}

Если вы хотите быть осторожным с многопоточностью, вы можете выбрать один из следующих вариантов:

1. Make property atomic
2. Use @synchronized over prop1
3. Use Mutex Lock
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...