Как предотвратить автоматическое сохранение / освобождение при вызове сообщения Obj-C из C ++? - PullRequest
1 голос
/ 19 октября 2011

У меня есть такой код:

@interface MyTimer : NSObject
- (int)getValue;
@end

@interface TimerHolder : NSObject {
    ExternalControl* m_externalControl;
}
@property (retain, nonatomic) MyTimer* timer;
@end

class ExternalControl {
    __unsafe_unretained TimerHolder* m_holder;
public:
    ExternalControl(TimerHolder* holder) : m_holder(holder);
    int getTimer() { return [m_holder.timer getValue] };
};

Метод ExternalControl::getTimer() вызывается очень часто.Во время профилирования я заметил, что во время вызова getTimer(), obc-j также вызывает objc_retain и objc_release (предположительно для m_holder или m_holder.timer), что приводит к тому, что он затрачивает много времени!Удаление __unsafe_unretained не имело значения.

По построению я знаю, что всякий раз, когда вызывается ExternalControl::getTimer(), m_holder и его таймер будут оставаться в живых на время вызова, поэтому я думаю, что сохраняет /релизы не нужны.

Есть ли способ предотвратить их вызов?

Я использую XCode 4.2 с iOS 5 SDK, с включенной ARC.Ответственен ли ARC, и удаление его приведет к удалению удержаний / выпусков?(Я не хотел тратить время на воссоздание проекта без ARC, просто чтобы проверить это, прежде чем проверять вас, друзья!)

Ответы [ 3 ]

2 голосов
/ 19 октября 2011

Если вы хотите вручную обработать сохранение / разблокирование только для этого класса (отключите ARC). установите флаг компилятора "-fno-objc-arc" на вкладке фаз сборки для этого исходного файла.

1 голос
/ 19 октября 2011

Я могу говорить только из опыта, не относящегося к ARC, так как я еще не использовал его (и не планирую, что это старая школа).

Однако у меня есть несколько проектов, использующих библиотеку C ++ и сохраняющих ссылкик нему в коде obj-C.Я точно знаю, что retain / release не вызывается, если явно не запрошено.

Кстати, я не мог использовать Obj-C при связывании библиотеки C ++ и вместо этого должен был использовать Obj-C ++, иначе конструктор C ++/ Деструкторы не были вызваны, как ожидалось.Это был просто вопрос переименования файла .m в .mm

Надеюсь, эта помощь.

0 голосов
/ 19 октября 2011

В сеансах WWDC 2011 по ARC особо упоминается, что при компиляции для отладки сохранение / выпуски ARC не оптимизируются.

Если нет, попробуйте запустить код в режиме выпуска и профилировать его.Вы должны увидеть значительную разницу.

Тем не менее, я знаю, что ARC не принимает во внимание тип предположений, которые вы подразумеваете, когда говорите «По конструкции».Но ARC не должен касаться вашей переменной экземпляра "__unsafe_unretained" ... вы уверены, что вызовы retain / release передаются указателю на , что ?

...