18

注: この他の質問は関連しているように見えますが、そうではありません:関連付けられたオブジェクトはいつ解放されますか?

次のように、インスタンスに 2 つ目の説明を追加しUIViewます。

- (void) setSecondDescription:(UIView*)view description2:(NSString*)description2 {
    objc_setAssociatedObject (view,&key,description2,OBJC_ASSOCIATION_RETAIN);
}

- (NSString*) secondDescription:(UIView*)view {
    return (id)objc_getAssociatedObject(view, &key);   
}

割り当てが解除された場合UIView、関連する記述 2 は割り当て解除されますか? これを自動的に行う方法はありますか?

4

4 に答える 4

71

dealloc タイムライン全体の説明を実際に見たい場合は、WWDC 2011、セッション 322、36:22 を見てください。ただし、基本的な概要は次のとおりです (覚えておきたかったので、これはコードの一部の実際のコメントです)。

関連するオブジェクトは、ライフ サイクルの最後に解放されることに注意してください。

// General Information
// We take advantage of the documented Deallocation Timeline (WWDC 2011, Session 322, 36:22).
// 1. -release to zero
//     * Object is now deallocating and will die.
//     * New __weak references are not allowed, and will get nil.
//     * [self dealloc] is called
// 2. Subclass -dealloc
//     * bottom-most subclass -dealloc is called
//     * Non-ARC code manually releases iVars
//     * Walk the super-class chain calling -dealloc
// 3. NSObject -dealloc
//     * Simply calls the ObjC runtime object_dispose()
// 4. object_dispose()
//     * Call destructors for C++ iVars
//     * Call -release for ARC iVars
//     * Erase associated references
//     * Erase __weak references
//     * Call free()
于 2012-06-01T01:59:37.637 に答える
3

はい。オブジェクトの割り当てが解除されると、関連付けられているオブジェクト (RETAINまたはCOPY関連付けタイプを使用する) はすべて自動的に解放されます。

于 2012-06-01T00:14:23.517 に答える
3

つまり、所有しているオブジェクトが解放されると、保持されている関連オブジェクトが解放されます。Apple のドキュメントの最初のセクションを参照してください

于 2012-06-01T00:17:43.453 に答える
2

Jody Hagins の回答のセクション 4 には、「関連する参照を消去する」と書かれていますが、これは参照が解放されたことを明示的に意味するものではありません。そこで、次のコードを使用して (ARC なしで注意してください)、これをテストしました。

@interface AssociatedObjectHelper : NSObject
@end

@implementation AssociatedObjectHelper
- (void) dealloc
{
    NSLog(@"In %s", __FUNCTION__);
    [super dealloc];
}
@end

@implementation AppDelegate
...
- (void) testReleaseAssociatedObject
{
    static const NSString *key = @"testKey123";
    NSObject *ob = [NSObject new];
    AssociatedObjectHelper *assocOb = [AssociatedObjectHelper new];
    objc_setAssociatedObject(ob, key, assocOb, OBJC_ASSOCIATION_RETAIN);
    [assocOb release];
    [ob release];
}

上記のコードを呼び出すと、実際には -[AssociatedObjectHelper dealloc] が呼び出され、次のスタック トレースが表示されます。

#0  0x000000010000528f in -[AssociatedObjectHelper dealloc]
#1  0x00007fff8a0bb89c in objc_object::sidetable_release(bool) ()
#2  0x00007fff8a0a537f in _object_remove_assocations ()
#3  0x00007fff8a0a1644 in objc_destructInstance ()
#4  0x00007fff8a0a1595 in object_dispose ()
#5  0x00007fff8a0bb89c in objc_object::sidetable_release(bool) ()
#6  0x000000010000e9b6 in -[AppDelegate testReleaseAssociatedObject]

Xcode 7.0.1 でテスト済み

于 2015-11-30T06:27:53.467 に答える