C ++からOBJ-Cメッセージを呼び出すときに自動保持/リリースを防ぐ方法は?
-
26-10-2019 - |
質問
私はこのようなコードを持っています:
@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とそのタイマーは呼び出され、コールの期間は生き続けるので、保持/リリースは不要だと思います。
それらが呼ばれないようにする方法はありますか?
iOS 5 SDKでXcode 4.2を使用しており、ARCを有効にしています。 ARCは責任を負い、それを削除すると保持/リリースが削除されますか? (友達と一緒にチェックする前に、これをテストするためだけにアークなしでプロジェクトを再作成するのに時間を費やしたくありませんでした!)
解決
まだ使用していないので、ARC以外の体験からのみ話すことができます(古い学校であることを計画していません)。
ただし、C ++ライブラリを使用して、OBJ-Cコードに参照を保持するプロジェクトがいくつかあります。明示的に要求されない限り、保持/リリースは呼び出されないという事実を知っています。
ところで、C ++ライブラリをリンクするときにOBJ-Cを使用できず、代わりにOBJ-C ++を使用する必要がありました。 .mファイルを.mmに変更するだけの問題でした
この助けを願っています。
他のヒント
そのクラスのために保持/リリースを手動で処理する場合(ARCを無効にします)。そのソースファイルの[-FNO-OBJC-ARC]コンパイラフラグを[ビルドフェーズ]タブに設定します。
ARCに関するWWDC 2011セッションでは、デバッグ用にコンパイルされた場合、ARCの保持/リリースが最適化されていないことに特に言及しています。
そうでない場合は、リリースモードでコードを実行してプロファイリングしてみてください。大きな違いがあるはずです。
ただし、「建設によって」と言うときに暗示するデザインの仮定の種類を考慮していないことは知っています。しかし、アークがあなたの「__unsafe_unretained」インスタンス変数に触れてはいけません...それらの保持/リリース呼び出しがポインターに渡されていることを確認してください それ?