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