【发布时间】:2015-09-09 20:47:28
【问题描述】:
假设我有以下单身人士:
@interface ABCSingleton: NSObject
@property (nonatomic, copy) NSString *name;
@property (nonatomic, strong) ABCViewController *mainViewController;
@end
@implementation ABCSingleton
+ (ABCSingleton *)sharedInstance {
static ABCSingleton *instance = nil;
static dispatch_once_t onceToken;
dispatch_once(&onceToken, ^{
instance = [ABCSingleton new];
});
return instance;
}
- (void)doSomething {
}
@end
如果 doSomething 包含此代码:
- (void)doSomething {
self.mainViewController.tapBlock = ^() {
self.name = @"abc";
};
}
...它将创建一个保留循环,因为 ABCSingleton 拥有 mainViewController,而 mainViewController 拥有 tapBlock,后者拥有 ABCSingleton。
如果我不使用 self 而是使用 sharedInstance 会怎样?
- (void)doSomething {
self.mainViewController.tapBlock = ^() {
[ABCSingleton sharedInstance].name = @"abc";
};
}
它还会创建一个保留周期吗? (解释为什么,或者为什么不,将不胜感激!)
【问题讨论】:
-
这将导致一个保留周期,但您应该问问自己,单例的保留周期是否重要。您为它定义了一个强静态引用,因此它永远不会消失。
-
@Fabian:很好,我更新了示例以说明为什么我特别希望不创建保留周期。我不希望 mainViewController 永远留在内存中。
-
同样,保留周期无关紧要。
@property (nonatomic, strong) ABCViewController *mainViewController;将使mainViewController永远不会被释放,除非你在某处明确地把它设为 nil。
标签: ios objective-c retain-cycle