1

以下の挙動を確認しました。

2 つのプロパティ変数を取ります。

@property (nonatomic, retain) NSString *stringOne;
@property (nonatomic, assign) NSString *stringTwo;

コードの下に記述された.mファイルで..

 NSMutableString *localstring= [[NSMutableString alloc] initWithString:@"test"];
 self.stringOne = localstring;
 NSLog(@"localstring = %d", [string retainCount]);
 NSLog(@"string one retain count = %d", [self.stringOne retainCount]);
 self.stringTwo = localstring;
 NSLog(@"localstring = %d", [localstring retainCount]);
 NSLog(@"string two  retain count = %d", [self.stringTwo retainCount]);

ここでは、alloc のため、localstring 保持カウントは 1 です。今、私はself.stringOne = localStringを与えました。

stringOneのretainプロパティにより、localstringのretain回数は2回になります。今、私はself.stringTwo = localStringを与えました。

ここでも、localstring の保持カウントが 1 つ増えます。stringTwo に assign プロパティを指定したことに注意してください。実際には、localstring または stringTwo の保持カウントは、割り当てプロパティであるため、1 増加することはありません。私が間違っている場合は修正してください。

ありがとうジテン

4

5 に答える 5

5

retainCount; をダンプします。それは役に立たない。 http://www.whentouseretaincount.com/

あなたの混乱の原因は、ポインターがどのように機能するかを理解していないことにあります。次のようにコードを変更します。

@interface BBQ:NSObject
@property (nonatomic, retain) NSString *stringOne;
@property (nonatomic, assign) NSString *stringTwo;
@end

@implementation BBQ
- (void) burn
{
    NSMutableString *localstring= [[NSMutableString alloc] initWithString:@"test"];
    self.stringOne = localstring;
    NSLog(@"localstring = %p", localstring);
    NSLog(@"string one = %p", self.stringOne);
    self.stringTwo = localstring;
    NSLog(@"localstring = %p", localstring);
    NSLog(@"string two  = %p", self.stringTwo);
}
@end

次のようなものを吐き出します。

2013-04-11 08:48:13.770 asdffadsfasddfsa[18096:303] localstring = 0x10010aaf0
2013-04-11 08:48:13.772 asdffadsfasddfsa[18096:303] string one = 0x10010aaf0
2013-04-11 08:48:13.772 asdffadsfasddfsa[18096:303] localstring = 0x10010aaf0
2013-04-11 08:48:13.772 asdffadsfasddfsa[18096:303] string two  = 0x10010aaf0

実行中の文字列インスタンスは 1 つだけです。 localstring、、stringOneおよびstringTwoすべてが NSMUtableString の 1 つのインスタンスへの参照を保持します。

したがって、のその 1 つの文字列インスタンスの+1 RC が表示され、プロパティallocへの割り当ては +1 であり、の変更はありません。stringOnestringTwo

(RC は、デルタの観点からのみ推論する必要があります。オブジェクトを保持する場合は、オブジェクトが不要になったときのリリースとバランスをとる必要があります。オブジェクトが他の何かによって保持される可能性があることは関係ありません。)

于 2013-04-11T15:51:47.667 に答える
2

でプロパティを宣言するとretain、オブジェクトが自動的に「保持」されるため、保持カウントが増加します。

したがってNSMutableString *localstring= [[NSMutableString alloc] initWithString:@"test"];、retain count = 1; になります。

次にself.stringOne = localstring;、retain count = 2 にします。

私の考えでは、プロパティに保持が指定されている場合、この行の後 self.stringOne = localstring 、self.stringoneの保持カウントは1になるはずです

オブジェクトを作成すると、保持カウント 1 から開始されます。

于 2013-04-11T06:36:38.927 に答える
0

コードを書くときに見るのは決して良い考えではありませんがretainCount、この場合は正常に動作しています。メモリ管理の理解が少しずれているようです。

あなたの質問に答えるために、

NSMutableString *localstring= [[NSMutableString alloc] initWithString:@"test"];

これにより、変更可能な文字列Objectが作成され、その保持カウントがインクリメントされ、それへのポインターが返されます。はポインタではなくオブジェクトretainCountに関連付けられていることに注意してください。

それを保持プロパティに割り当てると、

self.stringOne = localstring;

オブジェクトに渡さretainれ、その保持カウントが再び 1 増加します。これで、オブジェクトの保持カウントが 2 になり、両方のポインターが同じオブジェクトを指しています。したがって、ログに記録すると、得られるものが得られます。これがあなたの質問に答えることを願っています。retainCount

于 2013-04-11T06:40:05.163 に答える