はい、上記の 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];
リクエスト オブジェクトは autoreleased モードであるため、ここではリリースは必要ありません。
2つのことを覚えておいてください。
1.) あなたretain
またはalloc-init
そのオブジェクトの場合、手動でオブジェクトを解放する必要があります。
2.) alloc メソッドを持たないクラス メソッドはオブジェクトを返すため、autoreleased
これらのオブジェクトを解放する必要はありません。
使用の欠点autorelease
:
わかりました、ではautorelease
どういう意味ですか?Autorelease とは、私たちではなく、オブジェクトをいつ解放するかをアプリが決定することを意味します。あなたの質問のケース2を想定してください。barView
が追加された後self.view
、この割り当てられたオブジェクトは必要ありません。したがって、私たちはそれを解放します。しかし、それをautorelease
モードのままにしておくと、アプリケーションはそれを長時間保持し、そのオブジェクトを保持することでメモリの一部を浪費します。したがって、ここでは 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
:)