2012-02-24 3 views
0

法1:ios何が仲間のallocの間で違いますか?

NSURLConnection *conn = [[NSURLConnection alloc] initWithRequest: 
         [NSURLRequest requestWithURL: 
          [NSURL URLWithString:appRecord.imageURLString]] delegate:self]; 
self.imageConnection = conn; 
[conn release]; 

方法2:

self.imageConnection = [[NSURLConnection alloc] initWithRequest: 
         [NSURLRequest requestWithURL: 
         [NSURL URLWithString:appRecord.imageURLString]] delegate:self]; 

答えて

4

回答:それは依存しています。私はあなたのself.imageConnectionプロパティが保持するように設定されていると仮定しています。

Automatic Reference Counting(ARC)が有効になっている場合、コンパイラがあなたのメモリ管理を担当するため、実際に違いはありません。 releaseに電話をかけることができないため、ARCを有効にして、2番目の例を使用するだけでした。

ARC以外の環境では、大きな違いがあります。投稿した最初の方法では、メモリが正しく解放され、2番目の方法ではそれがリークします。

説明すると、プロパティをretainと宣言すると、その名前が示すように、それが保持されます。 NSURLConnectionを作成するときに/ initを割り当てます。これは一度保持されます。その後、self.imageConnectionに割り当てます。これにより、保持カウントが再度インクリメントされます。

最初の例では、一時変数を使用しました。つまり、プロパティを割り当てたら、releaseを呼び出して保持カウントを「正規化」することができます。しかし、2番目の例では、一時的な変数はありません。参照を忘れてしまい、それを2回保持していたプロパティに代入します。これを解決するには

は、あなたがプロパティを割り当てるときに、このように、autoreleaseステートメントを追加することです:

self.imageConnection = [[NSURLConnection alloc] initWithRequest: [NSURLRequest 
               requestWithURL: [NSURL URLWithString:appRecord.imageURLString]] delegate:self] 
               autorelease]; 

...またはあなたがちょうどあなたがあなたの最初の例で示して何をすべきか、一時的に使用することができます変数。

すべてプロパティ - プロパティを宣言すると、そのプロパティを保持( '保持')するか、ポインタ(「割り当て」)またはコピー( 'コピー')します。割り当てられたプロパティにはこの問題はありません。