2011-10-27 14 views
0

私はUIView viewLoadingが.hで宣言されていると仮定します。私はそれを直接初期化しません(最初のコードで)。メモリ管理直接割り当てなしで割り当てる

最初のコード。

UIView *viewLoading2 = [[[UIView alloc] initWithFrame:CGRectMake(75 , 155, 170.0, 170.0)]]; 
viewLoading = viewLoading2; 
[viewLoading2 release] 

二コード:

viewLoading = [[[UIView alloc] initWithFrame:CGRectMake(75 , 155, 170.0, 170.0)]]; 

第三コード:最初のコード2本体

- (void) viewLoad:(UIView *) viewLoading2 
{ 
    viewLoading = viewLoading2; 
    //do i need to retain, alloc, or release something here? 

} 
  1. 、私はのdeallocでviewLoadingを解放する必要がありますか?私はその財産を宣言しなければ何が起こるでしょうか?

  2. 2番目のコードでは、最初のコードと同じ効果がありますか? (解除する必要があるかどうか)。

  3. 3番目のコードについては、最初のコードと同じ効果がありますか?私はそれをコードした後に何をすべきですか? (コメントを参照)

  4. iPhoneコードは、常に.hで宣言された変数のリリースが必要ですか?または、.hで宣言された変数が割り当てられている場合のみです。最初のコードのような場合、私はviewLoadingをdeallocする必要がありますか?

    self.viewloading = viewLoading2間で異なるもの

  5. 。最初の例で

viewloading = viewLoading2; 

おかげ

答えて

3

、あなたは(1回)オブジェクトを割り当てられ、そして、あなたは(1回)をリリースし、あなたは何もする必要はありません。 else。一方、viewLoadingは、viewLoading2にリリースを送信するとすぐに無効です。したがって、あまり有用なコードではありません。

まだ、viewLoadingをリリースしていないため、最終的に行う必要があります。

3番目のコードでは、パラメータを介してこのメ​​ソッドに渡されたオブジェクトに割り当てられたコードがすべて解放されます。このメソッドの実行中は有効である必要がありますが、後で使用するために保存する場合は、ここで保持してから終了する必要があります。

編集:私は私はあなたの質問4.インタフェースファイル(.h)での宣言だけでポインタのためのスペースを確保していると理解していない

。これはオブジェクト宣言ではないため、実際にオブジェクトを割り当てるまで、リリースは必要ありません。

self.viewloading = viewLoading2は、プロパティの設定メソッドを使用して割り当てを行います。 @propertyステートメントに "retain"がある場合、その割り当ての一部としてretainが実行されます。 `viewloading = viewLoading2 'はまっすぐな代入で、保持されません。

+0

こんにちは、最初のコードでは、無効かどうかは、"あなたがreleeをviewLoading2に送信するとすぐに非常に有用ではないコード "です。viewLoading2はviewLoadingによって保持されませんか? viewLoadingのリリースを行う必要がありますか? 2番目のコードでは、リリースをdeallocのままにしてもかまいませんか? –

+0

私も自分の質問を編集しました。おそらくあなたもそれに答えることができます:D –

+0

私はコード1への私の答えを明確にしましょう。それは有効な構文であり、メモリリークはありませんが、viewLoadingはすでにリリースされているオブジェクトを指しているので、代入文で行ったことは、両方のポインタが同じオブジェクトを指し示して、それを解放したことだけでした。だから、彼らはもはや有効なオブジェクトを持っていないメモリの場所を指しています。 – Flyingdiver