2011-01-19 12 views
1

保持し、自動リリースの質問。基本的な保持、自動解除の質問

// A 
UIView *temp = [[UIView alloc] init]; 
myView = temp; 
[temp release]; 

// B 
myView = [[UIView alloc] init]; 

2つのコードに違いはありませんか?

NSString *str = [NSString stringWithString:@"Hello"]; 
NSString *str = @"Hello"; 

そしてこれらの2つ?私はまだカウントを保持するか分からない。ありがとうございました。

+0

私の記事を編集していただきありがとうございます:) – Suho

答えて

3

最初の例では、それらは非常に異なります。最初のコードチャンクでは、tempに与えられたUIViewの保持カウントは1です(allocのおかげで)。 3行目にリリースすると、オブジェクトが破損する可能性があるため、MyView変数が悪い状態になりました。あなたはMYVIEWがそれを維持したい場合は、操作を行います。

MyView = [temp retain]; 

最初の例の2番目の部分は、temp関係がないのUIView、まったく新しいインスタンスを作成します。

2番目の例では、メソッドはautoreleaseという文字列になります。つまり、「リリースプール」が解放されたときに自動的に解放されます。あなたはそれを解放することを心配する必要はありません。ただし、2行目では文字列が静的に割り当てられます。保持カウントと解放は全く必要ありません。

忘れないでください...保持ルール/リリースルールの詳細については、the answer to this questionをご覧ください。

+0

ありがとうTesserexと他の人もあります! – Suho

0

最初の部分:これは同じではありません!

ポインタをコピーするだけなので、MyViewもリリースされます(保持カウント0)。 2番目のコードMYVIEWで は1


第2部分の数を維持しています:それは基本的に同じです。

0
  1. 参照MyViewはtempを指していることに注意してください。したがって、一時的にリリースすると、MyViewにも影響します。

  2. [NSString stringWithString:]は、主にメモリアドレスを参照する代わりに他の文字列をコピーするために使用されます。例えば:

A:

のNSString *文字列= someOtherString。 // someOtherStringへの参照をコピーします。

B:

NSStringの*文字列= [NSStringのstringWithString:someOtherString]。 //他の文字列のコピーを作成します。

+0

これは当てはまりませんが、stringWithStringは文字列をコピーせず、文字列を返します。 –

0

1つの有用なことは、あなた自身がテストを行うことができるように、NScountのretaincountができることです。

ご質問に戻る...

IF MyViewはプロパティで、self.MyViewで参照し、retainまたはcopyで宣言した場合、2つのステートメントは同じです。 MYVIEWは単なるローカル変数である場合は、あなたのUIViewのは、あなたがそれをallocedので、保持カウントを増やすために何もしなかったので、あなたが

[temp release]; 

を行うときにdeallocます。あなたの文字列例えば

...

[NSString stringWithString:@"Hello"]; 

は自動解放文字列を返します。あなたが非常に長い時間それを保持する必要がある場合は、あなたはそれに保持を置くしたいでしょう。

2番目の文字列の例は、静的に割り当てられた文字列であり、心配する必要はありません。保持カウントは適用されません。

+0

myViewはドットを使用していないため、プロパティであるかどうかは関係ありません。 – bbum

+0

私はすでにそれを修正しました。 –

+0

ありがとうStefan! – Suho