0

オブジェクトを解放しなければならないときに、何らかの状況で混乱しますか? オブジェクト C でいつオブジェクトをリリースするかを知りたいのですが、自動リリースの欠点をオブジェクトに割り当てる場合に自動リリースを使用できますか? 次のオブジェクトをどこでリリースしますか?

ケース 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];
4

2 に答える 2

2

はい、上記の 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:)

于 2012-10-12T07:06:03.100 に答える
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- void -memory-leaks-in-iPhone-applicationsリンクを参照してください。

于 2012-10-12T07:06:17.657 に答える