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";

で、この二人?保持数についてはまだわかりません。ありがとうございました。

4

4 に答える 4

3

最初の例では、それらは大きく異なります。最初のコード チャンクでは、temp に指定された UIView の保持カウントは 1 です (おかげでalloc)。3 行目で解放すると、オブジェクトが破壊される可能性があるため、MyView 変数は不良になります。MyView に保持させたい場合は、次のようにします。

MyView = [temp retain];

最初の例の 2 番目の部分では、UIView のまったく新しいインスタンスを作成しますが、これは とは関係ありませんtemp

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

言及するのを忘れました...保持/解放ルールの詳細については、この質問への回答を確認してください。

于 2011-01-19T16:16:28.697 に答える
0
  1. 参照MyViewは単にtempを指していることを忘れないでください。したがって、tempを解放するとすぐに、これはMyViewにも影響します。

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

A:

NSString * string = someOtherString; //someOtherStringへの参照をコピーします;

B:

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

于 2011-01-19T16:17:48.247 に答える
0

便利なことの1つは、retaincountをNSLogできるため、自分でテストを実行できることです。

しかし、あなたの質問に戻って...

MyViewがプロパティであり、self.MyViewで参照していて、retainまたはcopyで宣言されている場合、2つのステートメントは同じです。MyViewが単なるローカル変数である場合、UIViewは実行時にロックを解除します

[temp release];

割り当ててから保持数を増やすために何もしなかったからです。

文字列の例では...

[NSString stringWithString:@"Hello"];

自動解放された文字列を返します。あなたがそれを非常に長い間保つ必要があるならば、あなたはそれを保持したいと思うでしょう。

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

于 2011-01-19T16:18:09.367 に答える
0

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

ポインターをコピーしているだけなので、MyView も解放されます (保持カウント 0)。2 番目のコードでは、MyView の保持カウントは 1 になります。


第二部:基本的に同じです。

于 2011-01-19T16:17:15.557 に答える