想象一下三个班级。 ClassA和ClassB是我的。第三个类是UIViewController,其代码我无法修改:
在ClassA中:
- (void) aMethod
{
ClassB *classBInstance = [[[ClassB alloc] init] goWithOptions:options];
}
ClassBInstance
仅在aMethod
的生命周期内保留。
在ClassB中:
- (void) goWithOptions
{
AUIViewController *avcInstance = [[AUIViewController alloc] init];
avcInstance.delegate = self;
[viewController pushViewController:avcInstance animated: YES]; // this returns immediately, but we need self to be retained until the delegate is done with it
}
- (void) cleanupCalledByDelegate //
{
// cleanup
}
调用-goWithOptions
方法时,被调用者保留avcInstance
,但传递给delegate
的self不被保留。这意味着只要-goWithOptions
返回,aMethod
完成,就会释放classBInstance
,delegate
的{{1}}不再有效。
理想情况下,我想将avcInstance
(ClassB中的自我)的所有权与classBInstance
绑定;当avcInstance
被释放时,avcInstance
或代理被释放。
或者,我可以在classBInstance
中清除classBInstance
,cleanupCalledByDelegate
在释放avcInstance
之前调用。
如何最好地处理这个问题?我宁愿不让ClassB *classBInstance
成为ClassA的属性,因为那时我必须让它发布classBInstance
,我更愿意在ClassB中处理它。如果这是最好的解决方案,我会使用块,在ClassA中,传递一个完成块:
{
classBInstance = nil;
}
到-goWithOptions
,我会在-cleanupCalledByDelegate
中调用。这是处理这个问题的正确方法吗?
答案 0 :(得分:5)
如果您只是想“将classBInstance(ClassB中的self)的所有权绑定到avcInstance”,则可以使用objective-c对象关联:
#import <objc/runtime.h>
objc_setAssociatedObject( avcInstance, "my_association", classBInstance, OBJC_ASSOCIATION_RETAIN );
此外,如果以后需要更方便访问classBInstance,可以将此关联代码包装到类别扩展中,该类扩展将classBInstance公开为avcInstance上的属性。