1

他の誰かのコードに取り組んでいます。プロジェクトの分析中にコードの断片に出くわした

self.groupPicker = [[UIPickerView alloc] initWithFrame:CGRectMake(0,260,320,216)];
self.groupPicker.delegate = self;
self.groupPicker.showsSelectionIndicator = YES;
[self.view addSubview:self.groupPicker];

groupPicker はUIPickerプロパティです。プロジェクトを分析すると、この場合、リークの可能性があるという警告が表示されました。また、メソッドで groupPicker プロパティが解放されていないことにも気付きましたdealloc_groupPickerプロジェクトのどこにもリリースされていません。この場合、どうすればよいですか?

  1. プロパティを削除して、代わりに変数をUIPicker宣言する必要があります。UIPicker

  2. groupPicker のようにリリースするだけでいいですか[_groupPicker release];

groupPicker は .h ファイルに一度保持され、上記のコードに示すように再度割り当てられるため、保持カウントはどうなるでしょうか。

4

5 に答える 5

1

1) いいえ、物件を所有することはまったく問題ありません。問題は、物件が過剰に保持されていることです。保持カウントが 1 の割り当て/初期化を行うと、保持カウントを再び増加させる保持プロパティを使用します。保持カウントは現在 2 であり、dealloc でオブジェクトを解放すると仮定すると、保持カウントは 1 になります。つまり、リークされたオブジェクトです。

問題を処理する方法はたくさんあります。最善の方法は、初期化時にオブジェクトを自動解放することだと思います。そのようです

self.groupPicker = [[[UIPickerView alloc] initWithFrame:CGRectMake(0,260,320,216)] autorelease];

2) 保持するものはすべて dealloc で解放する必要があるため、dealloc では次のようにする必要があります。

- (void)dealloc {
    [_groupPicker release];
    [super dealloc];
}
于 2012-05-22T13:44:37.823 に答える
0

ARC(自動参照カウント)を使用する必要があります

そのためには、編集>リファクタリング> ObjectivecARCに変換する必要があります

于 2012-05-22T13:33:14.950 に答える
0

iOS5 以降のアプリケーションにはARCを使用することをお勧めしますが、そうしたくない場合はautoreleaseafterinitメソッドを使用してください。

于 2012-05-22T13:40:26.997 に答える
0

気を付けて!次のようなプロパティを設定すると

self.property1 = x;

また、property1 が保持として宣言されている場合、property1 内の以前のオブジェクトが解放され、新しいオブジェクト (x) が保持されます。これがこれを行う理由です:

self.property1 = [[x alloc] init];

property1 が保持として宣言されている場合、x を 2 回保持します。(init 用、プロパティの設定用) 正しい方法は、オブジェクトを宣言し、プロパティに設定してから解放することです

object x = [[class alloc] init];
self.property1 = x;
[x release];

このようにして、オブジェクト x をプロパティ ホルダーに解放する「責任」を与えます。

于 2012-05-22T13:36:28.493 に答える
-1

UIPickerView _groupPicker(またはインスタンス変数の名前)にautorelease割り当てるか、値にを使用して割り当てます。

(問題は、保持されたプロパティに割り当てると保持が発生し、オブジェクトにはすでに保持が存在することallocです。)

于 2012-05-22T13:33:24.110 に答える