1

合成しているretain属性で定義されたプロパティがあります。

@property (nonatomic, retain) UISwitch *mySwitch;

そして、loadView内でこれを行っています:

self.mySwitch = [[UISwitch alloc] initWithFrame:CGRectMake(0, 0, 40, 20)];

そして最後に私のdeallocの中で私はこれをやっています:

self.mySwitch = nil;

1つの割り当てを使用したので、このオブジェクト(mySwitch)をリークしていますか?フレームを割り当てながら自動リリースする必要がありますか?

提案してください。

4

4 に答える 4

4

この線:

self.mySwitch = [[UISwitch alloc] initWithFrame:CGRectMake(0, 0, 40, 20)];

実際には、呼び出しは2回保持されます。1回allocはへの割り当てで、もう1回はself.mySwitch(値が割り当てられている場合に指定したプロパティですretain)。私が言われた修正はautorelease、回線に呼び出しを追加して、それ:

self.mySwitch = [[[UISwitch alloc] initWithFrame:CGRectMake(0, 0, 40, 20)] autorelease];
于 2011-02-23T23:21:53.773 に答える
2

はい、あなたは漏れています。を使用して所有オブジェクトを作成し、+alloc/-initWithFrame:その所有オブジェクトを。とマークされたプロパティに割り当てますretain。これにより、オブジェクトへの2番目に所有される参照が作成されます。この時点で、元の所有参照をリークします。これにより、オブジェクト自体がリークします。

ここでの正しい動作は-autorelease、オブジェクトをプロパティに割り当てる前にオブジェクトを呼び出すことです。

self.mySwitch = [[[UISwitch alloc] initWithFrame:CGRectMake(0, 0, 40, 20)] autorelease];

接線方向のメモでは、内のプロパティにアクセスすることはお勧めしません-dealloc。これに一般的に与えられる2つの理由は、1)内部に不要なKVO通知をブロードキャストすること-dealloc、および2)誰かが(このクラスまたはサブクラスで)セッターをオーバーライドすると、正しく動作しない可能性があることです。推奨されるアプローチは、基になるivarを単純に解放することです。そのため、代わりに次のようなものが表示されます。

[mySwitch release];

プロパティにnilを割り当てることは、他の場所では完全に安全です(そして推奨されます)。

于 2011-02-23T23:21:56.503 に答える
1

自動解放の代わりに、より厳密なメモリ管理が必要な場合は、次のようにします。

UISwitch *myswitch_tmp= [[UISwitch alloc] initWithFrame:CGRectMake(0, 0, 40, 20)];
self.mySwitch = myswitch_tmp;
[myswitch_tmp release];

その後、例えばdeallocで

[mySwitch release];
于 2011-02-24T00:00:35.360 に答える
-4

はい。オブジェクトをリークしています。ここで1つの簡単なルールを覚えておいてください:

使用+allocする場合は、常に対応する必要があります-release

于 2011-02-23T23:22:13.900 に答える