2012-04-11 66 views
0

我有這樣一個setter:iPhone - 這會泄漏嗎?

- (UIImagePickerController *) foto { 

    if (_foto == nil) { 
     _foto = [[UIImagePickerController alloc] init]; 
     _foto.delegate = self; 
    } 
    return _foto; 
} 

聲明它像

@property (nonatomic, retain) UIImagePickerController *foto; 

@synthesize foto = _foto; 

在我的dealloc我有

[_foto release]; 

在一些點在我的代碼中,我想這樣做

self.foto = nil; 

但事情在我的靈魂說,分配給self.foto對象之前會泄漏,因爲它是在二傳手頁頭......我怎麼做是正確的?

謝謝。

+0

_foto = self;對我沒有意義嗎?我沒有明白。 (我永遠不會使用它,但也許你知道比我多得多)。 – 2012-04-11 03:06:23

+0

對不起,這是一個錯字。正確的是_foto.delegate = self ... – SpaceDog 2012-04-11 03:08:49

+1

ahh謝謝。我以爲是超級奇怪。 – 2012-04-11 03:41:00

回答

1

編輯:不,應該沒問題。只要你在釋放之前沒有給_foto分配別的東西,它就可以工作。

是。您創建一個對象,然後鬆開指向它的指針。如果你在init行上拋出一個autorelease,那會修復它。你也可以使用ARC。

init行實際上並沒有做任何事......您將指針指定給您創建的對象,然後將其分配給其他內容。

+0

所以,你的想法是在setter上放置一個autorelease,並從dealloc中移除[_foto release]? (我不能在這個項目中使用ARC) – SpaceDog 2012-04-11 03:10:13

+0

不要緊,你的編輯應該沒問題。 – 2012-04-11 03:13:55

1

我不認爲那裏有泄漏。當你像這樣指定self.foto:self.foto = nil;時,它會自動釋放前一個。如果您通過這種方式分配它:_foto = nil;,您需要在分配前手動釋放它。

0

是的,工作,並不會泄漏。當您設置_foto的值時,其保留計數爲1(因爲您稱爲alloc)。只要你在dealloc中釋放它(你曾說過你這樣做),你應該沒問題,因爲保留數會回到0.除非你的setter也是你寫的,而且寫得不正確。如果它不是nil,它需要顯式釋放舊值。類似這樣的:

- (void)setFoto:(UIImagePickerController*)foto { 
    if (_foto) { 
      [_foto release]; 
      _foto = nil; 
    } 
    if (foto) 
      _foto = [foto retain]; 
} 
+0

正如yibuyiqu所說,如果你用'retain'聲明瞭一個屬性,那麼它會自動釋放舊值。瞧,沒有泄漏! – samson 2012-04-11 03:20:37

+0

實際上,你應該小心 - 如果你只是在'dealloc'中寫了'[_foto release]',並且你還沒有調用你的getter,你就會崩潰。檢查指針是否爲零,第一:'if(_foto)[_foto release];' – samson 2012-04-11 03:22:19

+2

發送釋放消息(或任何消息)到一個零指針不會崩潰。它會忽略該消息。 – borrrden 2012-04-11 03:31:44