2012-05-27 2 views
-1

замечающий, как плохо реализован является подсчет ссылок в текущей Objective-C (см here и here), я уверен, что там должна быть библиотека, там и нечто похожее на C++ shared_ptr и weak_ptr семантики без всех этих нелепых дополнительных звонков на retain и release, которые должны вызываться автоматически, когда переменные (указатель) выходят за рамкиshared_ptr/weak_ptr реализации для Objective-C

Возможно ли это на ObjC? Я знаю, что ObjC не имеет деструкторов, поэтому нет возможности автоматически вызвать что-то, когда переменные выходят за пределы области видимости, но как могут возникнуть эти вызовы retain/release? я обойду это неправильно?

ответ

2

Это бережно относится к ARC. Помимо ARC, нет действительно хорошего способа сделать это. В C++ у вас есть объекты стека, и вы можете перегрузить назначение (=) и deference (->). Оба они необходимы для общих указателей. Niether можно сделать в объекте C.

9

Замечая, как плохо реализован является подсчет ссылок в текущей Objective-C ...

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

Возможно ли это на ObjC?

Да, это возможно. Он называется ARC («Автоматический подсчет ссылок»). См. «Transitioning to ARC Release Notes» для получения дополнительной информации.

Я знаю, что ObjC не имеет деструкторов

На самом деле, это делает. Вот что такое метод -dealloc.

... когда переменные выходят из области видимости

вещи, чтобы понять о Objective-C является то, что объектов не выходит за рамки, так как объекты могут быть выделены только на куче (< Вставить нормальное оговорку здесь о не скопированных блоках >). Указатели на эти объекты (т. Е. Переменные) могут входить и выходить из области видимости, но сами объекты всегда находятся в области видимости, потому что куча технически считается глобальной по объему. (Просто, если вы потеряете адрес объекта, его почти невозможно найти снова)

+0

спасибо за ваш ответ. По вопросу о том, что переменные не могут выходить за пределы области действия, потому что они выделены в кучу. Да Но указатель себя как на стек. Отслеживание ссылочного отслеживания (выполняемое 'release') должно вызываться, когда те указатели стека выходят за рамки. Извините, я признаю, что я не знаком с моделью управления памятью objC, но я думаю, что моя критика должна делиться всеми, у кого есть опыт использования ссылок на подсчеты на языках, где возможна идиома RAII. – lurscher

+1

@lurscher да, указатели находятся в стеке.Но в C (на котором построен Objective-C) указатель - это просто число, которое интерпретируется как адрес памяти. И из моего грубого понимания RAII, похоже, что только потому, что язык построен вокруг потока управления на основе исключений, верно? (Чтобы гарантировать, что деструкторы запуска) Если это так, то это спорный вопрос, потому что Objective-C * действительно * отпугивает исключение на основе потока управления. Но, как я уже сказал, ARC - это компилятор, пытающийся сделать то, что вы хотите для вас. Он работает очень хорошо. –

+0

Я понимаю, что указатели - это просто значения, но у компилятора есть знания, необходимые для добавления сообщений о выпуске, когда переменные указателя выходят из области действия, он просто выбирает, чтобы оставить эту нагрузку программисту. Хуже всего то, что это, как представляется, бремя, которое не может быть должным образом скрыто как деталь реализации объекта-указателя библиотеки. Кроме того, RAII намного шире, чем просто механизм освобождения ресурсов, когда происходит исключение, но это выходит за рамки текущего вопроса для обсуждения. – lurscher

Смежные вопросы