Смешивание сборки мусора с нормальным кодом - PullRequest
3 голосов
/ 18 марта 2010

Я знаю, как обходиться с Objective-C, и у меня есть опыт сбора мусора из .NET, хотя я никогда не использовал его в Objective-C. Я пишу свой код, не используя его.

Теперь я думаю об использовании одной из платформ (блоков), которая доступна только для GC. У меня вопрос - могу ли я по-прежнему использовать фреймворк без каких-либо изменений в моем текущем коде без GC и без использования GC сам?

Ответы [ 3 ]

3 голосов
/ 19 марта 2010

Процесс является GC или не-GC. То есть все Objective-C всегда будут GC'd или никогда не будут GC'd. Нет смешивания двух моделей памяти в одном процессе. Вы не можете смешивать только GC-фреймворк с не-GC-фреймворком.

При создании инфраструктуры вы можете установить для GC "поддерживаемый", и в этот момент среда может использоваться в процессе GC или не в GC. Однако вам придется поддерживать корректность для обеих работающих сред по отдельности.

Что это за структура "блоков", на которую вы ссылаетесь? Если вы говорите о блоках, языковой функции, поставляемой в Objective-C Snow Leopard, то она отлично работает как в GC, так и в других системах.

3 голосов
/ 18 марта 2010

Как указано в руководстве по программированию сборки мусора , «код, скомпилированный как GC Required, предположительно не использует традиционные методы сохранения / выпуска Какао и может не загружаться в приложение, которое не выполняется с сборкой мусоравключено. "

Так что, к сожалению, нет.Но как много работы потребуется для сборки мусора, зависит от вашего приложения.Вы можете попробовать протестировать, чтобы увидеть, выглядит ли он как большой проект.(Это часто бывает, но иногда это не так уж и плохо.)

0 голосов
/ 18 марта 2010

В настройках проекта вы можете компилировать с поддержкой GC ( НЕ требуется ), и они должны прекрасно перемешиваться. Компиляция с поддержкой GC, но не обязательной, должна позволить retain / release работать вместе с GC

Если вы не можете скомпилировать проект с поддержкой GC, у вас будут проблемы.

РЕДАКТИРОВАТЬ: Чтобы уточнить: Если вы компилируете свой проект с необходимым GC (-fobjc-gc-only), ваш код сохранения / выпуска будет игнорироваться. Если вы компилируете без отношения к GC, вы не можете использовать платформу GC. Однако, если вы компилируете с поддержкой GC (-fobjc-gc), ваш код сохранения / выпуска будет работать по мере необходимости, и также будет работать инфраструктура GC.

РЕДАКТИРОВАТЬ: Для дальнейшего уточнения (я очень устал сегодня): Если вы включаете каркас только для GC, вы должны скомпилировать с -fobjc-gc или -fobjc-gc-only и запустить с сборкой мусора, в которой В случае, если ваши заявления о сохранении / выпуске действительно будут недействительными. Однако, если вы скомпилируете с -fobjc-gc-only и попытаетесь включить фреймворк, который не собран ни с какой поддержкой GC, у вас будут проблемы. В то время как я понимаю, что если вы компилируете с -fobjc-gc, вы можете включить фреймворк только для GC, а также фреймворк без GC. Из документов, на которые я ссылался выше:

Код, скомпилированный как GC. Предполагается также содержать традиционные сохранить / освободить логику метода и может быть загружается в любое приложение.

Так что, если вы хотите, чтобы ваш Framework хорошо играл с чем-либо, вам лучше скомпилировать с -fobjc-gc вместо -fobjc-gc-only.

Видимо, мне было тяжело переносить мысли на клавиатуру вчера. Согласно документам:

-fobjc-gc-only Это означает, что присутствует только логика GC. Код скомпилирован как GC Требуется, как предполагается, не использовать традиционный какао сохранить / выпустить методы и не могут быть загружены в приложение, которое не работает с сборка мусора включена.

Таким образом, если вы строите свою среду с GC Required, вы не сможете загрузить ее в приложение без поддержки GC.

Также в соответствии с документами:

-fobjc-gc Это означает, что присутствует логика как GC, так и retain / release. Код скомпилировано как предполагается GC Поддерживается также содержать традиционные сохранить / освободить логику метода и может быть загружается в любое приложение.

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

Я прошу прощения за мой неясный бродить вчера. Я спал 3 часа и пытался сделать несколько вещей одновременно. Никогда хорошая идея.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...