我正试图在我的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
}
...
提前致谢!
答案 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的其他方法。
(你可以添加所需的协议,我跳过它以获得更清晰的代码)