Posts tagged: ObjC
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 *)¢er))
[newCenter release];
}
return center;
}