[英]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.