私はOBJC_ASSOCIATION_ASSIGNが存在することを知っていますが、対象オブジェクトが解放されている場合は参照をゼロにしますか?それとも、その参照が不要になるか、あとでアクセスが悪くなるという昔のようなものでしょうか?弱参照でobjc_setAssociatedObjectを使用
答えて
試した後、答えはNOです。
私はiOSの6シミュレータの下に次のコードを実行しましたが、それはおそらく、ランタイムの前の繰り返しで同じ動作を持っているでしょう:
NSObject *test1 = [NSObject new];
NSObject __weak *test2 = test1;
objc_setAssociatedObject(self, "test", test1, OBJC_ASSOCIATION_ASSIGN);
test1 = nil;
id test3 = objc_getAssociatedObject(self, "test");
最後に、TEST1とTEST2は皆無であり、TEST3があります以前にtest1に格納されたポインタtest3を使用すると、すでに割り当てが解除されているオブジェクトにアクセスしようとします。
そこにタイプミス? "test1"は "test"と "test2"にどのような関係がありますか? – Jeff
この動作はドキュメントやヘッダーではわかりませんので、現在の動作が何であるかを識別できたとしても、実装する必要はありません。私はそれがではなく、ではないと思います。理由は次のとおりです。
一般に、-dealloc
の間に、iVarsで参照番号をnil
にする必要はありません。オブジェクトが解放された場合、解放されたオブジェクトまたはそのiVarsへのそれ以上のアクセスは、それ自体ではプログラミングエラーであるため、iVarsがゼロにされたかどうかは関係ありません。実際には、ではなく、ではなく、-dealloc
の間に間違ったアクセスが行われることをお勧めします。詳細が明らかになり、バグが早く公開されています。
編集:ああ、私はあなたの質問を誤解していると思います。弱い参照をゼロにしたい関連するストレージはそれらをサポートしていないようです。 __weakとマークされた1つのivar /プロパティを持つ簡単なパススルークラスを作成し、同じような効果を得ることができます。小さなkludgeyが、それは動作するだろう。
私が見ているケースでは、オブジェクトが割り当て解除された後にオブジェクトにアクセスしようとすると間違いではありません。デリゲートへの参照のような弱い参照がある場合、私はそれがメッセージするときにもう存在しないと予想しています。 – ultramiraculous
超々実証されているように、OBJC_ASSOCIATION_ASSIGN
は弱参照をゼロにしないので、割り当て解除されたオブジェクトにアクセスする危険性があります。しかし、あなた自身を実装するのはかなり簡単です。あなただけの弱参照を持つオブジェクトをラップする単純なクラスが必要になります。
@interface WeakObjectContainer : NSObject
@property (nonatomic, readonly, weak) id object;
@end
@implementation WeakObjectContainer
- (instancetype) initWithObject:(id)object
{
if (!(self = [super init]))
return nil;
_object = object;
return self;
}
@end
次にあなたがOBJC_ASSOCIATION_RETAIN(_NONATOMIC)としてWeakObjectContainer
を関連付ける必要があります。
objc_setAssociatedObject(self, &MyKey, [[WeakObjectContainer alloc] initWithObject:object], OBJC_ASSOCIATION_RETAIN_NONATOMIC);
とそれをアクセスするためにobject
プロパティを使用しますWeakObjectContainer
に似
id object = [objc_getAssociatedObject(self, &MyKey) object];
Hehe!本当にスマートなアプローチ。大好きです!私はそれを覚えておきます。 – MonsieurDart
なぜNSValue :: valueWithNonretainedObjectを使用しないのですか? – AlexDenisov
' - [NSValue nonretainedObjectValue]'は* weak *オブジェクトを返さないため、弱参照をゼロにしません。 – 0xced
つ以上のオプション:
をゼロに弱参照を取得するために- (id)weakObject {
id (^block)() = objc_getAssociatedObject(self, @selector(weakObject));
return (block ? block() : nil);
}
- (void)setWeakObject:(id)object {
id __weak weakObject = object;
id (^block)() = ^{ return weakObject; };
objc_setAssociatedObject(self, @selector(weakObject),
block, OBJC_ASSOCIATION_COPY);
}
- 1. ルア弱参照
- 2. 弱い参照conundrum
- 3. Androidコンテキスト弱参照
- 4. ブロック内の弱い参照
- 5. clojureの弱い参照
- 6. メモリリークと脆弱な参照
- 7. SoftReference /弱い参照にNullPointer
- 8. 弱参照メソッドは使用できますか?
- 9. Javaの弱参照を使用するコスト
- 10. 弱参照キーを使用したSwift辞書?
- 11. 弱い参照を持つJavaシングルトン
- 12. 文を参照して、弱いIBoutlets
- 13. 値への弱い参照を伴う弱いハッシュマップ?
- 14. AS3のEventListenersで弱参照を使用する利点は何ですか?
- 15. iOS:ARCのIBOutlets for nibs(カスタムUITableviewCell用)の強い参照または弱い参照
- 16. Boost.Python:オブジェクトへの弱い参照?
- 17. 弱参照とNULLの設定
- 18. 弱い参照またはポインタ
- 19. ThreadLocalリソースのリークと弱い参照
- 20. 弱ブロック内の参照およびサイクル
- 21. scoped_ptrへの脆弱な参照?
- 22. 弱い/強い参照ポインタの関係
- 23. 弱参照を持つNSMutableDictionary:CFRetainをコールバックとして使用する際の警告
- 24. 関数パラメータ型を使用して弱参照を避けますか?
- 25. 弱い参照を使用してメモリリークを避ける最善の方法..?
- 26. アンドロイドAsyntask:コンテキストの使用弱参照は、著者が述べている
- 27. 弱参照はいつ使用する必要がありますか?
- 28. Facebookの「弱い参照」のプロフィールリンクとは何ですか?
- 29. インターフェイスは強くまたは弱い参照ですか?
- 30. シングルトンではなく弱い「割り当て」参照
ええ、本当です。やってみます。 – ultramiraculous