Install this theme
Красивая инициализация синглтонов

Увидел сегодня очень интересный метод инициализации класса один раз (вернее на самом деле - не один раз, но “должен остатся только один”). Все закручено вокруг libc’шного OSAtomicCompareAndSwapPtrBarrier, который гарантирует либо атомарную установку указателя на нужный объект или фейл. Таким образом надо проверить статическую переменную, и если она все еще nil - то создать новый экземпляр себя и попробовать подменить nil настоящим указателем. Если получилось - у нас есть первый и единственный инстанс объекта, если нет - то было создано два (или более) объектов одновременно и все лишние пойдут в release.

Собственно сниппет (спионерен отсюда):

+ (id)defaultCenter
{
	static MAKVONotificationCenter *center = nil;
	if(!center)
	{
		// do a bit of clever atomic setting to make this thread safe
		// if two threads try to set simultaneously, one will fail
		// and the other will set things up so that the failing thread
		// gets the shared center
		MAKVONotificationCenter *newCenter = [[self alloc] init];
		if(!OSAtomicCompareAndSwapPtrBarrier(nil, newCenter, (void *)&center))
			[newCenter release];
	}
	return center;
}