2011-08-30 142 views
0

是,當我設置這樣的attribut有沒有內存泄漏:內存管理問題

titleView = [[UIWebView alloc] initWithFrame:CGRectMake(10, 0, 300, 5)]; 

,並有與

UIWebView *newWebView = [[UIWebView alloc] initWithFrame:CGRectMake(10, 0, 300, 5)]; 
[self setTitleView:newWebView]; 
[newWebView release]; 

感謝差異,

編輯: 我在mdoc函數中釋放titleView

回答

1

假設您有一個名爲titleView的屬性。

@property(保留)titleview的

首先一個泄露,除非你釋放它的dealloc (但要注意,如果你不止一次分配給它)

正確的應該是:

self.titleView = [[[UIWebView alloc] initWithFrame:CGRectMake(10, 0, 300, 5)] autorelease]; 

使用self.propertyName總是很好的做法,因爲它也釋放舊值。

+0

** [self setPropertyName:] ** - 使用** self.propertyName **分配值時調用相同的方法。所以這與方法之間的內存管理沒有區別。 – Nekto

+0

實際上我指出,第二個(分配屬性)在內存管理上更好。直接分配實例變量總是更危險 –

+0

,但是當我編寫UIWebView分配時,保留計數爲1.然後當我編寫titleView = [...]時,保留計數應該是2.然後我釋放titleView到dealloc函數,所以保留計數回到1 =>內存泄漏。這就是我的看法,但我可能是錯的。 –

0

如果titleView被拒絕而沒有保留屬性則存在差異。

在第一種情況下,一切都會好的。第二個 - [newWebView release]後不能使用titleView

0

假設你已經宣佈正確的proerty:

@property (nonatomic, retain) UIWebView *titleView; 

如果這樣做:

self.titleView = [[UIWebView alloc] initWithFrame:CGRectMake(10, 0, 300, 5)]; 

那麼您泄漏,但是當你這樣做的像伊娃直接:

titleView = [[UIWebView alloc] initWithFrame:CGRectMake(10, 0, 300, 5)]; 

你沒事。

但是,你需要釋放它在的dealloc:

- (void)dealloc { 
    [titleView release], titleView = nil; 
    [super dealloc]; 
} 
+0

您不需要在'dealloc'方法中將'titleView'設置爲'nil' - 它永遠不會被調用兩次:) – deanWombourne

+0

那麼這部分有很長的討論。請參閱:http://iphonedevelopment.blogspot.com/2010/09/dealloc.html – rckoenes

+0

請鏈接 - 我想了解人們對此有不同看法的原因! – deanWombourne

0

不要用實例和/或局部變量混淆屬性。一個屬性(或屬性)通過self訪問,而實例變量直接由其名稱訪問。

在第一個例子中有泄漏,因爲我看不到發送到titleView的發佈消息。如果titleView是實例變量,您可以使用viewDidUnload方法釋放它。如果它是本地的 - 你應該在添加到某個視圖時釋放它(如第二個示例中所示)。

在第二個示例中沒有內存泄漏。