Как получить адрес объекта c объекта в void *volatile* под ARC?

У меня есть простой объект c object

NSManagedObjectContext * moc = nil

Теперь мне нужно передать его в функцию в среде ARC, которая принимает параметр типа

void *volatile * value

Я пытался

&((__bridge void *)moc))

но я получаю следующую ошибку компилятора

Address expression must be lvalue or a function pointer

я тоже пробовал

void ** addr = (__bridge void **)(&moc);

Но я получаю ошибку

Incompatible types casting 'NSManagedObjectContext * __strong *' to 'void **' with a __bridge cast

Есть ли способ сначала передать, а затем получить адрес приведенного указателя?

ИЗМЕНИТЬ

Чтобы быть более конкретным, я пытаюсь реализовать шаблон singleton, описанный в другом вопросе stackoverflow, но у меня возникают проблемы подача адреса целевого объекта c NSManagedObjectContext в третий аргумент следующей функции в среде ARC.

OSAtomicCompareAndSwapPtrBarrier(void *__oldValue, void *__newValue, void *volatile *__theValue)


person Tony    schedule 29.12.2011    source источник
comment
Насколько я читал, использование __bridge на void*, вероятно, обречено на провал.   -  person Hot Licks    schedule 30.12.2011
comment
Хм, а почему void * и __bridge несовместимы друг с другом?   -  person Tony    schedule 30.12.2011
comment
Потому что __bridge ожидает указатели объектов с обеих сторон.   -  person Hot Licks    schedule 30.12.2011
comment
Есть ли способ обойти это для достижения желаемых результатов?   -  person Tony    schedule 30.12.2011
comment
Что ж, чтение документации было бы хорошим началом.   -  person Hot Licks    schedule 30.12.2011


Ответы (1)


Другой современный одноэлементный паттерн, который я часто видел/использовал в современную эпоху, использует dispatch_once GCD. Вы напрямую спрашивали о приведении указателей для ARC (и подробнее об этом ниже), но с точки зрения удовлетворения ваших реальных потребностей, почему бы просто не сделать это с помощью GCD? Нравится:

+ (NSFoo*)sharedFoo
{
    static dispatch_once_t pred;
    static NSFoo* sFoo;
    dispatch_once(&pred, ^{ sFoo = [[NSFoo alloc] init]; } );
    return sFoo;
}

Как видите, если вы посмотрите на источник для dispatch_once , GCD реализует тот же шаблон, который вы пытаетесь реализовать здесь. GCD решает проблему, с которой вы сталкиваетесь, не используя отслеживаемый ARC указатель как то, что он CompareAndSwaps, а скорее используя суррогатное значение (здесь pred), так что даже если у вас есть некоторое отвращение к использованию GCD для вашего синглтона, вы можете подумайте о том, чтобы имитировать их подход и использовать суррогатную мать.

Тем не менее, если вы просто используете GCD для своего случая, вам никогда не придется беспокоиться о таких вещах, как грубое приведение указателя ARC. Вы также можете быть уверены, что реализация GCD будет вести себя одинаково на разных платформах/архитектурах (MacOS/iOS).

person ipmcc    schedule 31.12.2011