1

以下のコードでは、alertが割り当てられ、初期化され、表示され、解放されました。リリース前とリリース後でalertも、同じアドレスを指しています。alertシステムがポインターをnilafter に設定しないのはなぜreleaseですか?:

 -(void) viewDidLoad {
        UIAlertView * alert = [[UIAlertView alloc] initWithTitle: @”Hello”
                       message: @”This is an alert view”
                       delegate: self
                       cancelButtonTitle: @”OK”
                       otherButtonTitles: @”Option 1”, @”Option 2”, nil];
        [alert show];
        [alert release];
        [super viewDidLoad];
    }
4

4 に答える 4

3

I. それが適切であったreleaseとしても、それが呼び出されたオブジェクト ポインターに対して何もできない (そして何もしない) ためです。また、手動参照カウントでは、ポインターが暗黙的に に設定されることはありません。これは、ARCnilでのポインターの機能です。weak

Ⅱ.そしてとにかくそれは間違っているでしょう。クラスは、UIAlertView表示時にサブビューとして一部のビューに追加されるため、保持されます。したがって、割り当てが解除されると予想される時点で、その参照カウントはゼロではありません。

于 2013-04-10T04:58:59.487 に答える
1

そのようなメッセージ送信では、ローカルではないポインターの値を変更することはできません。あなたは割り当てをしなければならないでしょう:

alert = [alert release];

ARC を使用してコンパイルする場合に使用できる弱いポインターがあることに注意してください。これはnil、ポイント先のオブジェクトが破棄されたときに、実際にランタイム ライブラリを使用して変数を出力します。

第二にrelease、オブジェクトを破棄する責任はありません。多くの場合、オブジェクトreleaseには他の所有者がいるため、送信後も実際にはまだ生きています。

于 2013-04-10T04:58:59.797 に答える
1

指し示す物体alertはまだ周りにあるからです。画面に表示されるため、メモリから削除することはできません。

呼び出しreleaseは、システムに「完了しました」と伝えるだけです。システム (およびそのオブジェクトへのポインターを保持する他のすべてのオブジェクト) が処理を完了するまで、メモリから明示的に何も削除しません。

于 2013-04-10T04:55:59.380 に答える
0

ポインターは「そのもののアドレス」を保持します。「releaseあのこと」に行きます。それらは異なる記憶場所です。

于 2013-04-10T04:58:23.343 に答える