1

我有一些这样的代码:

@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_retainand objc_release(可能在 m_holder 或 m_holder.timer 上),这最终会占用大量时间!删除__unsafe_unretained并没有什么不同。

通过构造,我知道无论何时ExternalControl::getTimer()调用, m_holder 及其计时器将在调用期间保持活动状态,因此我认为保留/释放是不必要的。

有什么方法可以防止他们被调用吗?

我将 XCode 4.2 与 iOS 5 SDK 一起使用,并启用了 ARC。ARC 是否负责并且删除它会删除保留/释放?(我不想花时间在没有 ARC 的情况下重新创建一个项目只是为了测试这个,然后再和我的朋友们核实一下!)

4

3 回答 3

2

如果您想手动处理该类的保留/释放(禁用 ARC)。在该源文件的构建阶段选项卡中设置“-fno-objc-arc”编译器标志。

于 2011-10-19T03:06:51.643 回答
1

我只能从非 ARC 的经验中发言,因为我还没有使用过它(并且不打算让它成为老派)。

但是,我有几个项目使用 C++ 库并在 obj-C 代码中保留对它的引用。我知道除非明确要求,否则不会调用保留/释放。

顺便说一句,在链接 C++ 库时我不能使用 Obj-C,而是必须使用 Obj-C++,否则 C++ 构造函数/析构函数不会按预期调用。只需将 .m 文件重命名为 .mm

希望这有帮助。

于 2011-10-19T02:30:13.483 回答
0

关于 ARC 的 WWDC 2011 会议特别提到,在为调试而编译时,ARC 保留/发布没有优化。

如果还没有,请尝试在发布模式下运行代码并对其进行分析。你应该看到一个显着的差异。

但是,我知道 ARC 没有考虑到您在说“按施工”时暗示的那种设计假设。但是,ARC 不应该触及你的“__unsafe_unretained”实例变量......你确定那些保留/释放调用正在传递一个指向它的指针

于 2011-10-19T03:10:13.703 回答