Я смешиваю некоторые ObjectiveC и C ++ в моем коде. (Мои файлы .mm
файлы вместо .m
.) Когда это правильная причина для переноса любого блока кода @autoreleasepool
? Не зная, что я делаю, я обертываю любой блок кода, который может содержать любую переменную не ObjectiveC, будь то int
, char
, std::string
или любой его указатель на переменную не-ObjectiveC. Итак, каждый метод класса в моем классе C ++ имеет @autoreleasepool
обертка внутри него.
Я делаю это неправильно?
Обратите внимание, что в предыдущих вопросах, связанных с этим вопросом, они говорили об использовании alloc, init и release, и теперь они кажутся устаревшими в XCode7 +. Итак, мне нужен последний совет по этому вопросу, а не старый совет. Мне нужен совет, касающийся XCode7 или выше.
Автозапуск пулов для ограничения срока службы вещей, которые были autorelease
Я внутри. autorelease
API Какао Objective-C, поэтому только код Objective-C может autorelease
вещи. Поэтому не имеет никакого смысла помещать пул автоматического выпуска вокруг блока чистого кода C / C ++, который вы точно никогда не вызовете в коде Objective-C.
Автозапуск пулов обычно полезен только в ситуациях, когда у вас есть цикл, который запускается много раз, когда каждая итерация может выполнить много autorelease
, Обратите внимание, что не весь код Objective-C будет autorelease
; это не очевидно. Некоторые API Какао будут autorelease
а некоторые не будут. Если это весь ваш собственный код, написанный на ARC, он, вероятно, не autorelease
,
Если вы используете AppKit, вам не нужно создавать пулы автоматического выпуска:
Application Kit создает пул автоматического выпуска в основном потоке в
начало каждого цикла цикла событий, и истощает его в
конец, тем самым освобождая любые автоматически выпущенные объекты, сгенерированные во время
обработка события. Если вы используете Application Kit, вы, следовательно,
как правило, не нужно создавать свои собственные пулы. Если ваше приложение
создает много временных автоматически выпущенных объектов в цикле событий,
тем не менее, может быть полезно создать «локальные» пулы автоматического выпуска
помочь минимизировать пиковый объем памяти.