2011-10-21 86 views
0

我知道這是一個常見問題,所以我需要一個解釋,所以我不會有這個問題。在我的頭文件,我已經定義了一個UIAlertView中,並保留它,如:EXC_BAD_ACCESS對警告視圖對象我保留,使用,然後釋放

@interface myController { 
    UIAlertView *alert; 
} 

@property (nonatomic, retain) UIAlertView *alert; 

在我的實現,我使用,如下重用此警報:

@synthesize alert; 

... 

    if (self.alert != nil) { 
     [self.alert release]; 
    } 

    self.alert = [[UIAlertView alloc] initWithTitle:title 
             message:message 
             delegate:self cancelButtonTitle:@"Cancel" otherButtonTitles: @"Ok To Send", nil]; 

    [self.alert show]; 

我在我的dealloc也釋放這。

所以,我聽說過內存管理的黃金法則,但我顯然不理解它。黃金法則說,你絕對不能釋放你沒有保留或通過alloc獲得的對象。您必須始終釋放您通過alloc保留或獲得的對象。

我將它保留在頭文件中,所以我最終必須在dealloc中釋放它。在我的實現中,我不止一次地執行了一個警告對象的分配,所以每當我準備好重新分配它時,我就釋放舊的。

請幫我理解我的誤解。

回答

1

@property與指定實現這樣的事情retain ...

-(void)setAlert:(UIAlertView*)alert 
{ 
     if (self->alert != alert) 
     { 
       [self->alert release]; 
       self->alert = [alert retain]; 
     } 
} 

因此,通過對財產分配一個新的值,該屬性將處理前值的release ......所以,當你手動release它,你過度釋放。

而且,由於你有@property設置爲retain,你應該autorelease分配給屬性之前:

self.alert = [[[UIAlertView alloc] initWithTitle:title 
             message:message 
             delegate:self cancelButtonTitle:@"Cancel" 
           otherButtonTitles: @"Ok To Send", nil] autorelease]; 

[self.alert show]; 
+0

真棒。非常感謝你的解釋。我一遍又一遍地被它困擾着 – JeffB6688

1

你的財產保留。所以當你用自己設定的時候*它會保留給你。同樣,當您將該屬性設置爲零或另一個對象時,它會釋放舊的屬性對象。

1

看起來你是雙重保留你的警報! self.alert做了保留,你的對象已經1 retainCount,因爲它被實例化的alloc初始化

試試這個:

//if (self.alert != nil) { 
// [self.alert release]; 
//} 

self.alert = nil; 

alert = [[UIAlertView alloc] initWithTitle:title 
            message:message 
            delegate:self 
cancelButtonTitle:@"Cancel" otherButtonTitles: @"Ok To Send", nil]; 

[self.alert show]; 

,而不是!

+1

我個人認爲這是在你不需要的屬性「經典」案例(除非你需要訪問另一個類的警報......) – ortnec

+0

或者是alertView委託,公平地說,我不認爲他是因爲我看不到任何協議列出。 – NJones

相關問題