2011-01-05 49 views
0

我正在實現一個登錄視圖,我需要這個視圖隨時在我的應用程序中顯示。因此,爲了使其更容易我創建一個名爲showLogin一個類的方法,當視圖關閉我希望它,所以我做釋放本身這一點:ObjC:如何正確實現一個釋放自己的類?

@implementation LoginController 

@synthesize releaseOnClose; 

+ (void)showLogin { 
    LoginController *login = [[LoginController alloc] init]; 
    login.releaseOnClose = YES; 
    [login show]; // Potential leak of login object 
} 

- (id)init { 
    if (self = [super initWithNibName:@"Login" bundle:[NSBundle mainBundle]]) { 
      releaseOnClose = NO; 
    } 
    return self; 
} 



- (void)show { 
    if (self.view.superview == nil) { 
      // show the view 
    } 
} 



- (void)btnCloseTouched { 
    [self.view removeFromSuperview]; 
    if (releaseOnClose) { 
      [self release]; 
    } 
} 

靜態分析器是告訴我,有上showLogin潛在的泄漏,但實際上並不是因爲我在btnCloseTouched中釋放對象(不必擔心登錄視圖的其他功能,現在只需打開和關閉)。

所以我想知道如何避免這種潛在的泄漏信息,以及如何正確實現這種類的方法來正確處理內存?

理念

,稍微介紹一下我的想法。我想調用showLogin,它會一直存在,直到它關閉而調用者不必管理實例。

回答

2

它在抱怨泄漏的原因是因爲你分配內存未釋放 - 例如:

LoginController *login = [[LoginController alloc] init]; 

而且你這樣做的方式似乎所有的倒退 - 真的不知道爲什麼你在本身內部實例化一個LoginController的新對象,然後釋放self以釋放新對象?必須有更好的方式來做到這一點。

您必須釋放您分配的那個實例 - self不是您分配的新實例(登錄)的實例。

做,當你用它做了以下:

[login release]; 
+0

我沒有得到第二部分。 self in btmCloseTouched是正確的實例。雖然,同意其他部分。 – Eiko 2011-01-05 14:17:38

+0

self!= LoginController * login = [[LoginController alloc] init];雖然。它可能是包含'login'的對象的正確實例,但它不是同一個實例。無論如何,代碼真的很混亂,因爲它是有缺陷的。 – xil3 2011-01-05 14:28:14

+0

@ xil3它看起來像類方法告訴實例顯示,然後實例接收關閉(和釋放)的動作。這絕對是奇怪的,但似乎可行。 – Richard 2011-01-05 15:16:16

0

爲什麼不爲登錄窗口創建一個新類(LoginView),然後確保類在dealloc之後自行清理。然後,您可以在需要時創建該類的新實例,並且在刪除它時不應發生內存泄漏。

+0

我不確定如果我得到您的建議,但我不認爲這是問題。所有的dealloc都可以,分析器告訴我們可能會有泄漏,因爲按照慣例,每個alloc都需要一個版本,並且它無法找到版本(在btnCloseTouched中)。我不確定是否正確實施了這種類。 – 2011-01-05 13:50:27

+0

我的意思是你應該爲登錄窗口創建一個單獨的類,然後當你需要顯示它時,創建一個實例,將它添加到你的視圖中,然後釋放它。當你從視圖中移除它時,它的內存將在'dealloc'中處理。這似乎是一個更經常的方法來做到這一點。 – 2011-01-06 18:35:42

1
在你的@implementation塊

你可以聲明的LoginController類是這樣的:

@implementation LoginController 

@synthesize releaseOnClose; 

LoginController *mySingleLoginController; 

然後在類中的方法,你可以做:

+ (void)showLogin { 
    mySingleLoginController = [[LoginController alloc] init]; 
... 

但作爲設計選擇,我不會推薦這種方法...

Moszi

0

爲什麼不去做普通的方式,讓該初始化類釋放它的情況下,或把它放在一個自動釋放池?

我沒有看到有一個類在某些操作發生時移除和釋放自身的好處。你這樣做的動機是什麼?

+0

我正在考慮簡化事情,但我改變了我的想法,因爲別人說這是錯誤的傾向。 – 2011-01-05 15:57:41