如何最好地保留ARC代表的自我?

时间:2013-08-06 20:54:56

标签: ios objective-c delegates automatic-ref-counting

想象一下三个班级。 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完成,就会释放classBInstancedelegate的{​​{1}}不再有效。

理想情况下,我想将avcInstance(ClassB中的自我)的所有权与classBInstance绑定;当avcInstance被释放时,avcInstance或代理被释放。

或者,我可以在classBInstance中清除classBInstancecleanupCalledByDelegate在释放avcInstance之前调用。

如何最好地处理这个问题?我宁愿不让ClassB *classBInstance成为ClassA的属性,因为那时我必须让它发布classBInstance,我更愿意在ClassB中处理它。如果这是最好的解决方案,我会使用块,在ClassA中,传递一个完成块:

{
    classBInstance = nil;
}

-goWithOptions,我会在-cleanupCalledByDelegate中调用。这是处理这个问题的正确方法吗?

1 个答案:

答案 0 :(得分:5)

如果您只是想“将classBInstance(ClassB中的self)的所有权绑定到avcInstance”,则可以使用objective-c对象关联:

#import <objc/runtime.h>

objc_setAssociatedObject( avcInstance, "my_association", classBInstance, OBJC_ASSOCIATION_RETAIN );

此外,如果以后需要更方便访问classBInstance,可以将此关联代码包装到类别扩展中,该类扩展将classBInstance公开为avcInstance上的属性。