考虑我在我的视图控制器中,我添加了Singleton属性的RACObserve,并且在subscribNext中我有一个自引用。 的代码如下:为什么此RACObserve块导致保留循环?
[RACObserve([Singleton shared], singletonFlag) subscribeNext:^(NSNumber *singletonFlag) {
self.flag = [singletonFlag boolValue];
}];
根据我的理解,自己不持有块的强引用(而块持有强烈的自我参照),这应该不会造成保留周期。 我已阅读反应可可的内存管理以及https://github.com/ReactiveCocoa/ReactiveCocoa/blob/master/Documentation/Legacy/MemoryManagement.md 在他们提供一个例子作为
[RACObserve(self, username) subscribeNext:^(NSString *username) {
[self validateUsername];
}];
我完全理解为什么它造成上述情况下的保留周期,我们需要的块内弱的自我。 我很困惑,为什么在第一种情况下,它会导致一个保留周期。为了确认这一点,只需将该代码片段粘贴到viewDidLoad后面,并查看视图控制器是否应该在何时解除分配。 如果你需要看到单身的多个实现,这是代码,
@interface Singleton : NSObject
@property (readwrite,nonatomic) BOOL singletonFlag;
@end
@implementation Singleton
+ (Singleton *)shared {
static dispatch_once_t pred = 0;
__strong static id _sharedObject = nil;
dispatch_once(&pred, ^{
_sharedObject = [[self alloc] init];
});
return _sharedObject;
}
- (id)init {
if (self = [super init]) {
NSLog(@"init of %@",NSStringFromClass(self.class));
}
return self;
}
@end
任何赐教这件事吗?
它不是一个真正的循环,但单永远不会被释放,由于是单身,所以对你的视图控制器持有强烈的参考的块永远不会放弃那个参考。 – dan
@dan为什么不作为回答发布? :) – mattsson
感谢@dan我想我现在得到它,这意味着这个subscribeNext块不像我们的正常定义的块(这是block执行后dealloc),我是否正确地说? –