当我必须释放一个物体时,我在某些情况下感到困惑?所以我想知道什么时候我们在目标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];
答案 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。)当您retain
或alloc-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];