2012-10-11 25 views
1

在我的課堂Foo- [Foo類]:發送到釋放實例上的[超級的dealloc]消息

[...] 
- (void)dealloc 
{ 
    NSLog(@"Foo is being dealloced!"); 
    [_property1 release]; 
    [_property2 release]; 
    [super dealloc]; 
} 
[...] 

我得到[super dealloc]-[Foo class]: message sent to deallocated instance

Foo繼承自NSObject。我還沒有使用ARC。在我們進入ARC之前,完成這個任務。

任何想法可能導致什麼?

+0

如果你刪除這兩個屬性釋放它的工作原理? – fbernardo

+0

這是一樣的.. –

+0

沒有更多的信息不能幫助你...你能發佈.h和.m嗎? – fbernardo

回答

4

我剛剛有同樣的問題,並解決它時,我停用殭屍對象。但我絕對沒有技術解釋爲什麼它有幫助。

+0

同樣在這裏 - 停用殭屍對象刪除此消息。 –

0

你能發佈更多的代碼嗎?我試過如下:

// Foo.h 

#import <Foundation/Foundation.h> 

@interface Foo : NSObject 

@property (nonatomic, strong) NSString *property1; 
@property (nonatomic, strong) NSString *property2; 

@end 

而且

// Foo.m 

#import "Foo.h" 

@implementation Foo 

- (id)init 
{ 
    self = [super init]; 

    if (self) 
    { 
     _property1 = nil; 
     _property2 = nil; 
    } 

    return self; 
} 

- (void)dealloc 
{ 
    NSLog(@"%s Foo is being dealloced!", __FUNCTION__); 
    [_property1 release]; 
    [_property2 release]; 
    [super dealloc]; 
} 

@end 

當我用它從我的視圖控制器,它就像一個冠軍,如:

// ViewController.m 

#import "ViewController.h" 
#import "Foo.h" 

@implementation ViewController 

- (void)viewDidLoad 
{ 
    [super viewDidLoad]; 

    Foo *foo = [[Foo alloc] init]; 

    foo.property1 = [NSString stringWithFormat:@"My name is %@", @"Rob"]; 
    foo.property2 = [NSString stringWithFormat:@"My age is %d", 29]; 

    [foo release]; 
} 

@end 

我做了這個測試中Xcode 4.5.1。也許你可以(a)確認這對你有用;和(b)驗證上述代碼與您的代碼之間的區別,以診斷問題的根源。

很明顯,問題不是由您對Foo的定義引起的,而可能是您的其他班級創建並最終釋放您的Foo對象的結果。您要麼在某處撥打dealloc,要麼更可能是您剛剛發佈(發行時沒有對應的allocretain)。

順便說一句,我建議通過靜態分析儀運行的代碼(選擇「分析」的「產品」菜單上,或按轉變 + 命令 + )。你不應該有任何分析儀產生的警告。靜態分析器非常適合尋找各種困擾非ARC代碼的基本內存管理問題。

1

調試器在對象正確解除分配後調用class方法,大概是在調試器變量部分顯示細節。 Xcode 4.4.1中的以下代碼在啓用殭屍和設置斷點的情況下足以觸發消息。

NSObject *object = [[NSObject alloc] init]; 
[object release]; 

這在Xcode 4.6中不是問題。

看看再回答這裏https://stackoverflow.com/a/14734241/1347502

相關問題