首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >保留目标选择器的循环

保留目标选择器的循环
EN

Stack Overflow用户
提问于 2015-05-23 05:49:59
回答 2查看 328关注 0票数 0

我是第一个保持循环的人,如果我的处境陷入困境,我会感到困惑。

我有个单身汉班

Singleton.h

代码语言:javascript
复制
@interface Singleton : NSObject

+ (Singleton *)sharedInstance;

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

@end

Singleton.m

代码语言:javascript
复制
@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
                               }

     }];    
}

现在,在视图控制器中,我调用在doSomethingWithData:untilDoneReturnToTarget:selector:类中定义的Singleton

代码语言:javascript
复制
- (void)function {
Singleton *singleton = [Singleton sharedInstance]
[singleton doSomethingWithData:someData
                 target:self
               selector:@selector(processResult:)];
}

- (void)processResult:(id)data {
…
}

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

提前谢谢。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2015-05-23 15:03:25

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

如果您希望保持相同的行为,但只有在目标仍然存在时才发出回调,请使用弱引用。

以下是一篇可能有助于http://digitalleaves.com/blog/2015/05/demystifying-retain-cycles-in-arc/的好文章

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

票数 1
EN

Stack Overflow用户

发布于 2015-05-24 17:25:26

如果您有一个单例,即使没有保留周期,它也不会被释放。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/30409359

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档