0

私のコードを確認してください:

@interface ClassA : NSObject {
    ClassB *objB;
}

@property (retain) ClassB *objB;
@end

@implementation ClassA:
@synthesiaze objB;
@end

int Main(int argc, const char *argv[])
{
    ClassA *objA = [[ClassA alloc] init];
    ClassB *objB = [[ClassB alloc] init];

    NSLog(@"%d", (int)[objB retainCount]);    // 1
    NSLog(@"%d", (int)[[objA objB] retainCount]);     // 0

    objA.objB = objB;

    NSLog(@"%d", (int)[objB retainCount]);    // 2
/* --> */    NSLog(@"%d", (int)[[objA objB] retainCount]);     // 3
    NSLog(@"%d", (int)[[objA objB] retainCount]);     // 4
    NSLog(@"%d", (int)[objB retainCount]);    // 4
}

23行目を見てください。 NSLog(@"%d", (int)[[objA objB] retainCount]);

結果は 3 ではなく 2 になるはずですが、呼び出すたび[objA objB]に保持カウントが 1 ずつ増えるようです。何が起こっているのかわかりません。誰が教えてくれますか?ありがとう!

4

3 に答える 3

4
于 2011-04-25T17:06:43.097 に答える
3

retainCountまず第一に、常に 100% 正確であることに頼らないでください。

そうは言っても、あなたが見ているのは、合成されたゲッターが次のようになっているからです。

- (ClassB *)objB
{
    return [[objB retain] autorelease];
}

したがって、合成されたゲッターを介してオブジェクトを要求すると、オブジェクトは保持され、自動解放されます。これは、所有権のないゲッターから取得したものはすべて、現在の自動解放プールの存続期間中続くはずですが、その間に objA を解放した場合、そうではないためです。

于 2011-04-25T16:38:57.513 に答える
2

@property は nonatomic としてマークされていないため、getter は単純な戻り値ではなく、ロック、保持、自動解放、およびロック解除 (スレッド セーフのため) です。独自のゲッターを作成するか、プロパティを @property (非アトミック、保持) として宣言できます。

于 2011-04-25T16:37:51.073 に答える