奇怪的内存地址导致BAD_ACCESS

时间:2011-08-24 07:36:01

标签: iphone objective-c cocoa-touch

我正试图在我的iPad应用程序中解决一个奇怪的问题。这是一个非常简单的应用程序,只有一个根视图控制器,里面有一个小板游戏。

有时,看似随机,应用程序冻结,我在我的一个类中使用的委托引用上获得了BAD_ACESS。我一直在解决BAD_ACCESS问题很长一段时间,但这很奇怪。委托所指的对象是根视图控制器,永远不应该释放。我在 - (void)dealloc方法中放了一个日志行,并且永远不会发生。我甚至试图过度保留物体,但它仍然消失了。

即使我在启用了NSZombie检测的探查器中运行应用程序,探测器也会在发生这种情况时停止。没有显示任何结果。

我注意到的另一个奇怪的事情是内存地址。如果我像NSLog(@“%p”,委托)那样记录它;结果我得到“0x1”。一个nil指针是0x0所以即使对象已经消失,测试if(delegate)确实返回true。即使对象本身被解除分配,内存地址仍然完好无损?

问题只发生在使用一段时间后,如15到45秒之间。

有人知道如何解决这个问题吗?我非常感激。

这是委派的分配方式。 _delegate是始终处于活动状态的根视图控制器。

-(id)initWithDelegate:(NSObject <TheGameDelegate>*)_delegate level:(int)_level;
{
    self = [super init];
    if(self != nil)
    {
        delegate = [_delegate retain];
        ...

这是崩溃的地方:

-(void)countdown:(NSTimer*)timer;
{
    time -= 1;
    if(delegate) // this is always true
    {
        NSLog(@"%p", delegate); // this prints a normal memory address until right before crash when it prints "0x1"
        [delegate theGameTick:self]; // accessing deleagte gives BAD_ACCESS
    }
    ...

提前致谢!

1 个答案:

答案 0 :(得分:0)

imo,你的委托实现很奇怪。恢复代表不是个好主意。

尝试添加标题: @property (nonatomic, assign) id delegate,然后方法看起来像
-(id)initWithDelegate:(id)_delegate level:(int)_level; { self = [super init]; if(self != nil) { self.delegate = _delegate; ...}

以及你引用self.delegate的其他方法。
(你可以添加所需的协议,我跳过它以获得更清晰的代码)