繁体   English   中英

奇怪的内存地址导致BAD_ACCESS

[英]Strange memory address resulting in BAD_ACCESS

我正在努力解决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
    }
    ...

提前致谢!

imo,您的委托实现很奇怪。保留委托不是一个好主意。

尝试添加到标题中: @property (nonatomic, assign) id delegate ,然后该方法将如下所示
-(id)initWithDelegate:(id)_delegate level:(int)_level; { self = [super init]; if(self != nil) { self.delegate = _delegate; ...}

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM