相关对象是否会自动释放?

注意:这个其他问题似乎相关,但不是: 什么时候关联的对象被释放?

我正在向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 deallocs,相关的描述2会得到处理? 有没有办法让这个自动发生?

如果你想实际看到整个dealloc时间线的描述,请看WWDC 2011,Session 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() 

是。 当对象被释放时,任何关联的对象(使用RETAINCOPY关联types)都会自动释放。

简而言之,是的 – 拥有的对象被释放时,被保留的关联对象被释放。 请参阅Apple 文档的第一部分

Jody Hagins的回答中的第4部分提到了“擦除关联引用”,它并没有明确暗示引用被释放。 所以我用下面的一段代码(注意WITH ARC)来testing这个。

 @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上testing