gpt4 book ai didi

ios - 如何最好地为 ARC 的委托(delegate)保留 self ?

转载 作者:塔克拉玛干 更新时间:2023-11-01 21:22:45 25 4
gpt4 key购买 nike

想象一下三个类(class)。 A类和B类是我的。第三类是 UIViewController,我无法修改其代码:

在 A 类中:

- (void) aMethod
{
ClassB *classBInstance = [[[ClassB alloc] init] goWithOptions:options];
}

ClassBInstance 仅在 aMethod 的生命周期内保留。

在 B 类中:

- (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 avcInstance 的 不再有效。

理想情况下,我想将 classBInstance(ClassB 中的 self)的所有权绑定(bind)到 avcInstance;当 avcInstance 被释放时,classBInstance 或委托(delegate)被释放。

或者,我可以在 -cleanupCalledByDelegate 中清理 classBInstance,它在 avcInstance 被释放之前调用。

如何最好地处理这个问题?我不想让 ClassB *classBInstance 成为 ClassA 的属性,因为那样我就必须让它释放 classBInstance,我更愿意在 ClassB 中处理它.如果这是最好的解决方案,我会使用 block 并在 ClassA 中传递一个完成 block :

{
classBInstance = nil;
}

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

最佳答案

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

#import <objc/runtime.h>

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

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

关于ios - 如何最好地为 ARC 的委托(delegate)保留 self ?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18090307/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com