当在目标C中释放对象时

时间:2012-10-12 06:52:41

标签: iphone ios memory-management

当我必须释放一个物体时,我在某些情况下感到困惑?所以我想知道什么时候我们在目标C中释放对象。我可以使用autorelease来分配对象自动释放的任何缺点吗?哪里发布以下对象?

案例1:

SelectFrame *obj=[[SelectFrame alloc]initWithNibName:@"SelectFrame" bundle:nil];
[[self navigationController] pushViewController:obj animated:YES];

案例2:

UIView *barView=[[UIView alloc]initWithFrame:CGRectMake(0, 500, 200,50)];
barView.backgroundColor=[UIColor redColor];
[self.view addSubview:barView];

案例3:

NSURLRequest *request = [NSURLRequest requestWithURL:
                         [NSURL URLWithString:@"https://xxxxxxxxxxxxxxxxx"]];
[[NSURLConnection alloc] initWithRequest:request delegate:self];

2 个答案:

答案 0 :(得分:2)

是的,您必须为以上两种情况发布。

案例1:

SelectFrame *obj=[[SelectFrame alloc]initWithNibName:@"SelectFrame" bundle:nil];
[[self navigationController] pushViewController:obj animated:YES];
[obj release];

案例2:

UIView *barView=[[UIView alloc]initWithFrame:CGRectMake(0, 500, 200,50)];
barView.backgroundColor=[UIColor redColor];
[self.view addSubview:barView];
[barView release]; 

案例3:

NSURLRequest *request = [NSURLRequest requestWithURL:
                     [NSURL URLWithString:@"https://xxxxxxxxxxxxxxxxx"]];
[[NSURLConnection alloc] initWithRequest:request delegate:self];

此处不需要发布,因为请求对象处于自动释放模式。

请记住两件事。

1。)当您retainalloc-init该对象时,您必须手动释放对象。

2。)没有alloc方法的类方法返回autoreleased对象,因此您不需要释放这些对象。

使用autorelease的缺点:

好的,autorelease是什么意思?自动释放意味着,而不是我们,但我们的应用程序将决定何时释放该对象。假设您的问题的案例2。将barView添加到self.view后,不需要此分配的对象。因此,我们发布它。但是,如果我们将它保持在autorelease模式,应用程序将保留更长时间,通过仍然保留该对象浪费一部分内存。因此,我们不应该在这里使用自动释放。

使用autorelease的好处:

这个过于流行的例子。

- (NSString*) getText
{
    NSString* myText = [[NSString alloc] initWithFormat:@"Hello"];
    return myText;
}

此处,第3行导致泄漏,因为我们不释放分配给myText的内存。 因此,

- (NSString*) getText
{
    NSString* myText = [[[NSString alloc] initWithFormat:@"Hello"] autorelease];
    return myText;
}

<强>解

使用ARC,忘记retain release:)

答案 1 :(得分:1)

如果在3个案例中使用 ARC ,那么无需释放只需明智地使用(如果需要,可以分配)

如果不使用ARC则需要发布

现在案例1:

SelectFrame *obj=[[SelectFrame alloc]initWithNibName:@"SelectFrame" bundle:nil];
[[self navigationController] pushViewController:obj animated:YES];
[obj release];

案例2:

UIView *barView=[[UIView alloc]initWithFrame:CGRectMake(0, 500, 200,50)];
barView.backgroundColor=[UIColor redColor];
[self.view addSubview:barView];
[barView release];

案例3:

NSURLRequest *request = [NSURLRequest requestWithURL:
                     [NSURL URLWithString:@"https://xxxxxxxxxxxxxxxxx"]];
[[[NSURLConnection alloc] initWithRequest:request delegate:self] autorelease];

参考How-to-avoid-memory-leaks-in-iPhone-applications链接。