簡體   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