Скажем, у меня есть следующий синглтон:Содержит ли ссылка на однопользовательский sharedInstance цикл сохранения?
@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
Если йоЗотеЬЫпд содержали этот код:
- (void)doSomething {
self.mainViewController.tapBlock = ^() {
self.name = @"abc";
};
}
... было бы создать сохранить цикл, поскольку ABCSingleton владеет mainViewController, владеющей tapBlock, который владеет ABCSingleton.
Что делать, если вместо использования self, я использовал sharedInstance?
- (void)doSomething {
self.mainViewController.tapBlock = ^() {
[ABCSingleton sharedInstance].name = @"abc";
};
}
Будет ли он создавать цикл удержания? (Объяснение относительно того, почему, или почему бы и нет, было бы оценено!)
Это вызовет цикл удержания, но вы должны спросить себя, имеет ли значение цикл удержания на одном элементе. Вы определили сильную статическую ссылку на нее, поэтому она никогда не уходит. – Fabian
@Fabian: Хороший момент, я обновил пример, чтобы показать, почему я специально стараюсь не создавать цикл сохранения. Я не хочу, чтобы mainViewController оставался в памяти навсегда. – Senseful
Опять же, цикл сохранения не имеет значения. '@property (неатомный, сильный) ABCViewController * mainViewController;' сделает так, что 'mainViewController' никогда не будет выпущен, если вы явно не отключите его. – Fabian