我有一些像這樣的代碼:如何防止從C++調用Obj-C消息時自動保留/釋放?
@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的項目,只是爲了測試這個,然後再和我的朋友們覈對一下!)
對我來說,它看起來像這個代碼違反了ARC規則之一,即不要在C結構中存儲對象指針(C++類在此實例中計算爲C結構)。所以正確的答案可能是不使用ARC來處理這個文件。 http://developer.apple.com/library/ios/#releasenotes/ObjectiveC/RN-TransitioningToARC/_index.html – JeremyP
爲什麼不把答案寫成答案而不是評論? – squelart
我不記得爲什麼不。也許我不覺得它正確回答了這個問題。那時我沒有做ARC編程。 – JeremyP