2

ブロックを使用したリテイン サイクルの回避については、ここにたくさん投稿されていますが、クラスやクラス メソッドを使用する場合はどうでしょうか。次のようなクラスがあるとします。

// MyClass.h

+ (void)doSomethingAsynch:(void (^)(void))block;
+ (void)doSomethingElse;

そして発信者はこれを言いたいです:

[MyClass doSomethingAsynch:^{
    [MyClass doSomethingElse];
}

呼び出し元は MyClass の unsafe_unretained コピーを宣言する必要がありますか? それとも、保持カウントを増加させないシングルトンのようなクラスですか? とにかく常に存在させたいので、クラスの保持カウントを月に送信しても問題はありませんか?

4

3 に答える 3

4

[[NSObject class] retainCount]を返すNSUIntegerMaxので、はい、クラスはシングルトンとして実装され、おそらくreleaseノーオペレーションとしてオーバーライドされます。

補遺:

行 1659のobjc ランタイム実装ではNSObject、...

+ (id)retain {
    return (id)self;
}

[NSObject retain]...これは何もしないことを確認します。

于 2013-01-10T22:16:53.877 に答える
2

あなたが示唆するように、クラスはシステムによって割り当てが解除されることは決してないので、それらを繰り返し保持して決して解放しないかどうかはほとんど問題になりません。私の推測ではretain、クラスでは何もしません。

于 2013-01-10T21:52:47.840 に答える
-1

これらのメソッドを静的/クラスメソッドとして公開しているため(たとえば、メソッドの場合は「-」ではなく「+」が先頭にあります)、もちろん、[[MyClass alloc] init]これらのメソッドのみを使用する場合は、この特定のクラスに対して行う必要はありません。を使用していないので、やallocを気にする必要はありません。retainrelease

最近のARC(自動参照カウント)では、ほとんど心配する必要はありませんretainreleaseとにかく、コンパイル時にすべてが追加されます。

編集:あなたがまだそれについて心配する必要がある時があるので、主に強調されて、またいくらかの明快さを加えました

于 2013-01-10T22:08:57.463 に答える