4

次のようなコードを使用している iOS 開発者を見てきました。

- (void)setupWebView:(UIWebView**)aWebView {
 UIWebView *webview = [[UIWebView alloc] init];
.....

 if (*aWebView) {
        [*aWebView release];
    }

    *aWebView = webview;
}

これが何を意味し、なぜこれを使用するのか知っていますか? ありがとう

4

3 に答える 3

41
- (void)setupWebView:(UIWebView**)aWebView {

それはひどいです。voidを返すメソッドは絶対に使用しないでください。ただし、次の場合を除いて、参照によって引数を設定します

•複数の引数が設定されています

•メソッドのプレフィックスはget

そのメソッドは、作成されたインスタンスを直接返す必要があります。そして、これはそれを悪化させるだけです-完全に間違っています:

 if (*aWebView) {
    [*aWebView release];
 }

 *aWebView = webview;
  1. カプセル化を破ります。呼び出し元がiVarスロットへの参照を渡した場合はどうなりますか。これで、呼び出し先が呼び出し元のメモリを管理するようになりました。これは、恐ろしい慣習であり、クラッシュする可能性が非常に高くなります(たとえば、同時実行性に直面した場合)。

  2. aWebViewがNULLの場合はクラッシュします。特に、割り当てでクラッシュします。

  3. aWebViewがiVarスロットを参照している場合、可能なプロパティの使用をバイパスします(カプセル化を解除する別の方法)。

于 2012-06-13T17:46:52.110 に答える
2

ポインタを初期化するメソッドです。最初の行は、オブジェクトを割り当てます。if ステートメントは、渡されたポインタへのポインタがまだ割り当てられていないことを確認します。割り当てられている場合は、それを解放します。次に、参照されたポインタを新しく割り当てられたオブジェクトに設定します。

于 2012-06-13T17:29:06.480 に答える