Install this theme

Posts tagged: ObjC

CoreData

CoreData на ифоне – вроде бы замечательный фреймворк с широкими возможностями… Но при портировании допущено столько ошибок! Я за сегодняшний день познакомился с десятком кодов ошибок Cocoa (я про коды ошибок не слышал со времен своего детства и Дельфей!). Код падает рандомно, совершенно не понятно, что можно делать, а что – нельзя. Ну и до кучи – кривая документация и примеры (более того дефолтный шаблон CoreData-приложения вообще сломан). Fail.

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

Увидел сегодня очень интересный метод инициализации класса один раз (вернее на самом деле - не один раз, но “должен остатся только один”). Все закручено вокруг 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;
}