gpt4 book ai didi

ios - 使用目标选择器保留循环

转载 作者:行者123 更新时间:2023-11-29 02:00:51 25 4
gpt4 key购买 nike

我是保留周期的新手,如果我的情况落入其中,我会感到困惑。

我有一个单例类

单例.h

@interface Singleton : NSObject

+ (Singleton *)sharedInstance;

- (void)doSomethingWithData:(NSDictionary *)data untilDoneReturnToTarget:(id)target selector:(SEL)selector;

@end

单例.m

@implementation RequestSingleton

static Singleton *shared = nil;

#pragma mark - System

- (id)init {
self = [super init];
if (self) {
}
return self;
}

#pragma mark - Interface

+ (Singleton *)sharedInstance {
static dispatch_once_t pred;

dispatch_once(&pred, ^{
shared = [[Singleton alloc] init];
});

return shared;
}

- (void)doSomethingWithData:(NSDictionary *)data untilDoneReturnToTarget:(id)target selector:(SEL)selector {
[someClass doSomething:data
completionHandler: ^{
if ([target respondsToSelector:selector]) {
#pragma clang diagnostic push
#pragma clang diagnostic ignored "-Warc-performSelector-leaks"
[target performSelector:selector
withObject:someObject]; // is this a retain-cycle?
#pragma clang diagnostic pop
}

}];
}

现在在 View Controller 中,我调用 Singleton 类中定义的 doSomethingWithData:untilDoneReturnToTarget:selector: :

- (void)function {
Singleton *singleton = [Singleton sharedInstance]
[singleton doSomethingWithData:someData
target:self
selector:@selector(processResult:)];
}

- (void)processResult:(id)data {

}

我不确定我在 doSomethingWithData:untilDoneReturnToTarget:selector: 中的实现是否已陷入保留周期?我应该在 block 实现中使用 weakTarget 而不是 target 吗?请帮我澄清一下。

提前致谢。

最佳答案

据我所知,您的代码中没有保留周期。但是您正在延长目标的生命周期,直到您完成数据处理。

如果你想保持相同的行为但仅当目标仍然存在时才发出回调,请使用弱引用

这是一篇可能对您有所帮助的好文章 http://digitalleaves.com/blog/2015/05/demystifying-retain-cycles-in-arc/

更新:循环引用最常见的情况之一是相互强引用:对象→ block 和 block →对象。有时你甚至可以通过使用 API 在不知情的情况下引入它,如果你不小心,它会在内部创建一个保留周期,例如ReactiveCocoa(这就是为什么他们甚至有宏来对抗它,称为 weakifystrongify)。

关于ios - 使用目标选择器保留循环,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30409359/

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