0

以下のような単純なメモリ管理の問題:

-(void)viewDidLoad
{
    ......
    self.label = [[[UILabel alloc] initWithFrame:labelFrame] autorelease];
    ......
}

管理プロトコルによると、ラベルはグローバル変数だと思います。「alloc」を使用してインスタンスを作成する場合は、単に「dealloc」する必要があります。なぜここで「autorelease」を使用するのでしょうか。

4

4 に答える 4

4

labelはグローバル変数だと思います...

いいえ、構文labelから明らかなように、投稿したコードを含むクラスのプロパティです。self.label明示的に宣言されているかどうかに関係なく、インスタンス変数によってバックアップされます。プロパティのセッターは、label渡された値が適切に保持されていることを確認する責任があります。UILabelを割り当てるコードは、UILabel-viewDidLoadを解放する役割を果たします。これは、呼び出しによって行われautoreleaseます。

...管理プロトコルによると、「alloc」を使用してインスタンスを作成する場合は、単に「dealloc」する必要があります...

それは正しくありません。-dealloc直接呼び出すことはありません。常に呼び出す-release-autorelease、作成したオブジェクトの使用が終了したときに呼び出します。詳細については、メモリ管理ルールを参照してください。

于 2012-05-18T02:08:32.737 に答える
1
self.label = [[[UILabel alloc] initWithFrame:labelFrame] autorelease];

UILabel *temp = [[UILabel alloc] initWithFrame:labelFrame];
self.label = temp;
[temp release];

適切なメモリ管理に関しては、基本的に同じです。メモリは、異なる時間に適切にクリーンアップされます。

そのラベルのプロパティは次のようなものになると思います。@property(nonatomic,retain)そのため、を呼び出したときにプロパティによって保持されていたため、ラベルは引き続き存在しますself.label

于 2012-05-18T01:36:33.510 に答える
0

autoreleaseは、将来のリリースのために変数をプールのリストにプッシュします。

NSAutoreleasePool* pool = [[NSAutoreleasePool alloc] init];
// your code
self.label = [[[UILabel alloc] initWithFrame:labelFrame] autorelease];
// your code
[pool release];

その後、電話する必要はありません

[self.label release];

変数が自動解放されるためです。そしてコード行で

[pool release];

で正常にリリースされます。

これは漏れ幅木用です

于 2012-05-18T01:48:54.727 に答える
0

Self.labelはプロパティです。

UILabel * tempLabel = [[UILabel alloc] initWithFrame:labelFrame]->保持カウントは1です

self.label=tempLabel->保持カウントが2になりました

ただし、self.labelのみを使用するため、autoreleaseを使用しないか、作成したラベルを解放すると、メモリリークの問題が発生します;)

于 2012-05-18T03:22:48.850 に答える