なぜbreaking-retain-cycleはこのように無限ループに陥らないのでしょうか?

ジェイソン・リー

以下は、質問を確認するための私のコードです。

0.保持サイクルをモックします

AとBの2つのクラスを作成します。

@interface A : NSObject

@property (strong, nonatomic) B *b;

@end

@implementation A

- (void)dealloc
{
    [_b release];
    [super dealloc];
}

@end

//

@interface B : NSObject

@property (nonatomic, strong) A *a;

@end

@implementation B

- (void)dealloc
{
    [_a release];
    [super dealloc];
}

@end

//そしてStrongViewController、にはtempAとtempBがあり、どちらもプロパティを割り当てます。

@interface StrongViewController ()

@property (nonatomic, assign) A *tempA;
@property (nonatomic, assign) B *tempB;

@end

//ではviewDidLoad、retain-cycleを作成し、aとbはお互いを保持します。

A *a = [[[A alloc] init] autorelease];
B *b = [[[B alloc] init] autorelease];

a.b = b;
b.a = a;

self.tempA = a;
self.tempB = b;

//次に、viewWillDisappearで、保持サイクルを中断しようとします。

[super viewWillDisappear:animated];
self.tempA.b = nil; // Key line

//ここで、ステップバイステップでサイクルに飛び込みます。

1.デフォルトのセッターを使用して保持サイクルを中断します

AのdeallocとBのdeallocに2つのブレークポイントを設定しました。

ここに画像の説明を入力してください ここに画像の説明を入力してください

//キーラインself.tempA.b = nil;が実行されたとき:

ここに画像の説明を入力してください

//メッセージがAのbに送信deallocされたため、Bが呼び出さreleaseれましたsetB

ここに画像の説明を入力してください

ここに画像の説明を入力してください

// Bdeallocでは、releaseメッセージがaに送信されたため、Adeallocが呼び出されました。

ここに画像の説明を入力してください

ここに画像の説明を入力してください

//さて、_bはnilデフォルトを使用しているためですsetB:

2.カスタムセッターを使用して保持サイクルを中断する

//しかし、setB:以下のようなカスタムを使用するとどうなりますか?

ここに画像の説明を入力してください

//キーラインself.tempA.b = nil;が実行されると、カスタムに遭遇しますsetB:

ここに画像の説明を入力してください

//これreleaseでbに送信されたので、Bに送信されますdealloc

// Bdeallocでは、[self holdCount]は0ではなく1のままであることに注意してください。なぜですか?

ここに画像の説明を入力してください ここに画像の説明を入力してください

//ここでBでdeallocreleaseは_aに送信されたのでdealloc、順番にAに送信され、そこで_bにrelease送信されます。

ここに画像の説明を入力してください ここに画像の説明を入力してください

// Here comes the difference, in A's dealloc, _b is not nil, and _b's retainCount is 1.

// According to my knowledge, if _b receives a release message now, it will call its dealloc then, because its retainCount is 1 for the moment.

// But, out of my imagination, it doesn't step into B's dealloc recursively, but just step over to the next line, leaving the retainCount with a big value 2147483648:

ここに画像の説明を入力してください

3. My question

// My question is on the above, why it step over when _b receives a release message, instead of stepping into its dealloc, while its retainCount is still 1 ?

// And how the retainCount 2147483648 comes out?

//詳細には、NSObjectが「リリース」メッセージを実際に受信したときにどのように機能するか、誰もがソースコードを知っていますか?でもAさんにdeallocさんretainCount`はまだ1で、そうであるbが

gnasher729

保持カウントが1のオブジェクトを解放すると、次のようになります。

オブジェクトは「デッド」としてマークされます。

Deallocメソッドが呼び出されます。

オブジェクトのメモリがOSに返されます。

オブジェクトがデッドとしてマークされている場合、保持と解放は効果がありません。ランタイムは、deallocを呼び出す前に、保持カウントをゼロに設定することすらしません。2番目のdeallocメソッドが呼び出され、retainCountが1を返しても、すでに死んでいるオブジェクトを解放しようとすると、何も起こりません。同じオブジェクトに対してdeallocが2回呼び出されることはありません。

この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。

侵害の場合は、連絡してください[email protected]

編集
0

コメントを追加

0

関連記事

分類Dev

なぜこれが無限ループに陥らないのですか?

分類Dev

Breaking retain cycle with strong/weak self

分類Dev

このソリューションが無限ループに陥らないのはなぜですか?

分類Dev

このgithubプロジェクトを使用しようとすると、無限ループに陥るのはなぜですか?

分類Dev

なぜこれが無限ループに陥るのですか?

分類Dev

このbashプログラムが無限ループに陥るのはなぜですか?

分類Dev

ループに陥ったように見えるのはなぜですか?

分類Dev

このコードが無限ループに陥るのはなぜですか?

分類Dev

無限ループからTimerTaskに切り替えると、CPU使用率がこのように低下したのはなぜですか?

分類Dev

予期しないHashSet.retainの動作

分類Dev

リーダーが無限ループに陥っているのはなぜですか

分類Dev

なぜこれが私の無限ループを修正@JsonIgnoreのでしょうか?

分類Dev

ConcurrentHashMapのは、無限ループに陥っ - なぜ?

分類Dev

なぜこのプロローグルールは無限ループに入らないのですか?

分類Dev

なぜ私は無限ループを持っているのですか、そしてそれをどのように違う方法で行うのですか?

分類Dev

セクションが無限ループにコンパイルされた場合、なぜこれが発生するのでしょうか。

分類Dev

彼は一体どうやってこのような実行中のアプリケーションをデバッグしているのでしょうか。さらに重要なのは、どうすればよいのでしょうか。

分類Dev

alias_methodはどのようにして無限ループを作成しないのですか?

分類Dev

この例の「for each」ループが「for」ループのように機能しないのはなぜですか?

分類Dev

このコードの私の分析は正しいですか、そしてなぜそれはこのように書かれるのでしょうか?

分類Dev

このAndroidScrollviewが無限スクロールに入らないようにするにはどうすればよいですか?

分類Dev

for(;;)ループが無限ループのように動作するのはなぜですか?

分類Dev

keras LSTMモデルが無限ループに陥るのはなぜですか?

分類Dev

getchar()で入力を取得すると、無限ループに陥るのはなぜですか?

分類Dev

この場合、useEffectが無限ループにヒットしないのはなぜですか?

分類Dev

関数を呼び出した後、なぜ無限ループに陥るのですか?

分類Dev

無限にループしないようにするにはどうすればよいですか

分類Dev

このシンプルなドロップダウン メニューを使用するにはどうすればよいでしょうか。

分類Dev

width:60% なのに、なぜこれらの div が左揃えになっているのでしょうか。

Related 関連記事

  1. 1

    なぜこれが無限ループに陥らないのですか?

  2. 2

    Breaking retain cycle with strong/weak self

  3. 3

    このソリューションが無限ループに陥らないのはなぜですか?

  4. 4

    このgithubプロジェクトを使用しようとすると、無限ループに陥るのはなぜですか?

  5. 5

    なぜこれが無限ループに陥るのですか?

  6. 6

    このbashプログラムが無限ループに陥るのはなぜですか?

  7. 7

    ループに陥ったように見えるのはなぜですか?

  8. 8

    このコードが無限ループに陥るのはなぜですか?

  9. 9

    無限ループからTimerTaskに切り替えると、CPU使用率がこのように低下したのはなぜですか?

  10. 10

    予期しないHashSet.retainの動作

  11. 11

    リーダーが無限ループに陥っているのはなぜですか

  12. 12

    なぜこれが私の無限ループを修正@JsonIgnoreのでしょうか?

  13. 13

    ConcurrentHashMapのは、無限ループに陥っ - なぜ?

  14. 14

    なぜこのプロローグルールは無限ループに入らないのですか?

  15. 15

    なぜ私は無限ループを持っているのですか、そしてそれをどのように違う方法で行うのですか?

  16. 16

    セクションが無限ループにコンパイルされた場合、なぜこれが発生するのでしょうか。

  17. 17

    彼は一体どうやってこのような実行中のアプリケーションをデバッグしているのでしょうか。さらに重要なのは、どうすればよいのでしょうか。

  18. 18

    alias_methodはどのようにして無限ループを作成しないのですか?

  19. 19

    この例の「for each」ループが「for」ループのように機能しないのはなぜですか?

  20. 20

    このコードの私の分析は正しいですか、そしてなぜそれはこのように書かれるのでしょうか?

  21. 21

    このAndroidScrollviewが無限スクロールに入らないようにするにはどうすればよいですか?

  22. 22

    for(;;)ループが無限ループのように動作するのはなぜですか?

  23. 23

    keras LSTMモデルが無限ループに陥るのはなぜですか?

  24. 24

    getchar()で入力を取得すると、無限ループに陥るのはなぜですか?

  25. 25

    この場合、useEffectが無限ループにヒットしないのはなぜですか?

  26. 26

    関数を呼び出した後、なぜ無限ループに陥るのですか?

  27. 27

    無限にループしないようにするにはどうすればよいですか

  28. 28

    このシンプルなドロップダウン メニューを使用するにはどうすればよいでしょうか。

  29. 29

    width:60% なのに、なぜこれらの div が左揃えになっているのでしょうか。

ホットタグ

アーカイブ