【发布时间】:2016-01-03 14:19:22
【问题描述】:
考虑我在我的视图控制器中,我添加了 Singleton 属性的 RACObserve,并且在 subscribNext 中我有一个自引用。 代码如下:
[RACObserve([Singleton shared], singletonFlag) subscribeNext:^(NSNumber *singletonFlag) {
self.flag = [singletonFlag boolValue];
}];
根据我的理解,self 不持有块的强引用(而块持有 self 的强引用),这不应该导致保留循环。 我也读过反应可可的内存管理https://github.com/ReactiveCocoa/ReactiveCocoa/blob/master/Documentation/Legacy/MemoryManagement.md 他们在其中提供了一个示例
[RACObserve(self, username) subscribeNext:^(NSString *username) {
[self validateUsername];
}];
我完全理解为什么它会导致上述情况下的保留循环,我们需要在块内有一个弱自我。 我很困惑为什么在第一种情况下会导致保留周期。要确认这一点,只需在 viewDidLoad 之后粘贴该代码 sn-p 并查看视图控制器是否在应有的时候被释放。 如果您需要查看更多单例的实现,这就是代码,
@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 我想我现在明白了,这意味着这个 subscribeNext 块不像我们正常定义的块(在块执行后是 dealloc),我这样说对吗?
标签: ios objective-c reactive-cocoa