使用目标选择器保留循环

时间:2015-05-23 05:50:00

标签: ios objective-c retain-cycle

我是新手保留周期,如果我的情况陷入困境我很困惑。

我有一个单身课

Singleton.h

@interface Singleton : NSObject

+ (Singleton *)sharedInstance;

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

@end

Singleton.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
                               }

     }];    
}

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

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

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

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

提前致谢。

2 个答案:

答案 0 :(得分:1)

据我所见,您的代码中没有保留周期。但是,在完成数据处理之前,您正在扩展目标的生命周期。

如果你想保持相同的行为,但只有在目标仍然存在的情况下才发出回调,请使用弱引用

这篇文章很有帮助http://digitalleaves.com/blog/2015/05/demystifying-retain-cycles-in-arc/

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

答案 1 :(得分:0)

如果您有单身人士,即使没有保留周期,也无法取消分配。

相关问题