记忆管理问题

时间:2011-08-30 12:41:30

标签: iphone ios memory-management

当我以这种方式设置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];

谢谢,

编辑: 我正在发布dalloc函数中的titleView

4 个答案:

答案 0 :(得分:1)

假设您有一个名为titleView的属性。

  

@property(保留)titleView

第一个泄漏,除非你在 dealloc 上发布它(但要注意你是否多次分配它)

正确的应该是:

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

最好使用self.propertyName,因为它也会释放旧值。

答案 1 :(得分:0)

如果titleView在没有保留属性的情况下被拒绝,则存在差异。

在第一种情况下,一切都会好的。在第二个中 - 您无法在titleView之后使用[newWebView release]

答案 2 :(得分:0)

假设你已正确宣布了这个项目:

@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];
}

答案 3 :(得分:0)

不要将属性与实例和/或局部变量混淆。通过self访问属性(或属性),而实例变量直接由其名称访问。

在第一个例子中有一个泄漏,因为我看不到发送给titleView的发布消息。如果titleView是实例变量,您可以使用viewDidUnload方法释放它。如果它是本地的 - 你应该在添加到某个视图时释放它(如第二个例子中所示)。

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