-1

私がやっていることは、obj を割り当てた後、この obj を解放した後、retainCount をチェックすることです。以下のように

@implementation ViewController

- (void)viewDidLoad
{
    [super viewDidLoad];
    TestClass *ptr = [[TestClass alloc] init];
    NSLog(@"retain count of ptr is %d",[ptr retainCount]);
    [ptr release];  
    NSLog(@"Right after release:::::retain count of ptr is %d",[ptr retainCount]);
}

コンソールに表示された後に得られるのは

2012-05-11 13:51:09.515 memoryManagement[1807:f803] retain count of ptr is 1
2012-05-11 13:51:09.516 memoryManagement[1807:f803] Right after release:::::retain count of ptr is 1

リリース後のretainCountがまだ1である理由はわかりません。0にする必要があります。

この問題について私にアドバイスし、コードに間違いがあるかどうかを指摘してください。

4

4 に答える 4

2

ココア クラブの最初のルールは、使用しないこと-retainCountです。ココア クラブの 2 つ目のルールは、使用しないこと-retainCountです。

まず、必要だと思う場合は、ほぼ確実に不要です。デバッグに使用している場合は、間違ったツールを使用しています。アプリケーション ロジックに使用している場合は、設計が壊れています。

第二に、それについて StackOverflow に質問する必要がある場合、それは絶対に必要ありません。

第三に、それは微妙で、信頼性が低く、あなたの背後で奇妙なことをする可能性があり、一般的に想像以上に頭痛の種になります. Bill Bumgarner のブログ投稿をお勧めします。

于 2012-05-11T18:11:13.343 に答える
1

オブジェクトの実際の保持カウントがゼロになることはありません。ゼロの場合、オブジェクトへの参照がなく、割り当てが解除されるためです。ただし、メモリは実際にはクリアされず、内部releaseコードが実際にカウントをデクリメントすることを気にしていないようです。

さらに、メモリ管理規則に違反しています。自分が所有するオブジェクトを取得し、それを解放します。そのポインターを介してそのオブジェクトと対話することはもう許可されていません。

ここには何も表示されません。オブジェクトの保持カウントを気にする必要はありません。

于 2012-05-11T18:20:43.840 に答える
1

保持カウントを使用するよりもさらに悪い問題があります。

リリースするオブジェクトにメッセージを送信しないでください。特に、retainCount が実際には 1 であると考える何らかの理由がある場合は特にそうです。リリースは次のように記述されている可能性があります。

-(void) release {
     if ([self retainCount] == 1) {
         [self dealloc];
     }
     else {
        // reduce the retain count
     }
}

その場合、オブジェクトはなくなります。メッセージを送信し、オブジェクトがまだ割り当て解除されたメモリに何らかの形で存在している場合、retainCount が 1 であると報告されます。割り当てが解除されている場合、リリースでオブジェクトをデクリメントする必要があるとは誰も言いません (誰が知っているでしょうか?)。

release を呼び出すと (オブジェクトにメッセージを送信しないことを約束しました)、約束を破ると、何かが起こる可能性があります。

Apple docs は、retainCount があなたが思っているものではない理由を説明しています

https://developer.apple.com/library/mac/#documentation/Cocoa/Reference/Foundation/Protocols/NSObject_Protocol/Reference/NSObject.html

重要 この方法は、通常、メモリ管理の問題をデバッグする際には役に立ちません。オブジェクトへの参照を保持するために任意の数のフレームワーク オブジェクトがオブジェクトを保持している可能性があると同時に、自動解放プールがオブジェクトの任意の数の遅延リリースを保持している可能性があるため、これから有用な情報を取得できる可能性はほとんどありません。方法。

ドキュメントでは、retainCount が本来あるべきだと思うものではなく、巨大な数字が表示されることがある理由についても説明しています。

解放されない (つまり、解放メソッドが何もしない) オブジェクトの場合、このメソッドは UINT_MAX を返す必要があります。

ただし、これはあなたのケースとは関係ありません。init の直後に ptr で keep を呼び出すと、retainCount が 2 と 1 (または N と N-1) として表示される可能性がありますが、これが真であるとは限りません。preserveCount は、これらの回答の多くが信じているよりも論理的ですが、確実に使用したい方法では使用できません。

于 2012-05-11T18:23:00.653 に答える
0

決して保持カウントを使用しないでください。紛らわしく、明確な答えが得られません。また、メモリ管理のガイドラインに正しく従っている場合は、retaincount を使用する必要はありません。

ほとんどの場合、あいまいな出力が得られます。例えば。[NSString stringwithstring:@"apple"] には、retaincount として 1124523415 などのガベージ値があります。

したがって、retainCount を信頼しないでください。

于 2012-05-11T18:07:27.877 に答える