2011-08-30 141 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方法释放它。如果它是本地的 - 你应该在添加到某个视图时释放它(如第二个示例中所示)。

在第二个示例中没有内存泄漏。