我有一个单身人士,我想在一个街区内捕捉它。我知道变量保留在块中,因为传递的对象的常量副本是创建的,除非使用该对象的弱实例,否则永远不会释放。我的好奇心是相同的行为是否适用于静态分配的变量。 这是我的代码(self是Class的sharedInstance):
+ (Class *)sharedInstance
{
static Class *sharedInstance = nil;
static dispatch_once_t onceToken;
dispatch_once(&onceToken, ^{
sharedInstance = [[Class alloc] init];
});
return sharedInstance;
}
[self setBlock:^(NSArray *array)
{
self.property = [array firstObject];
}];
答案 0 :(得分:3)
是的,该区块将永久保留单身人士!但是单身人士总是在记忆中。所以,没有什么可以发布的。因此,如果自我对象是单身,则绝对没有理由使用weakSelf。单身是一个永远存在于记忆中的对象。
答案 1 :(得分:2)
您声称“创建的对象的常量副本已创建”不正确。该块会对其使用的对象创建__strong
或__weak
或__unsafe_unretained
个引用;它不会复制对象。
您的代码会在self
和块对象之间创建一个保留周期,因为该块具有对self的强引用,并且(假设self.property
很强)self
具有强引用块。
编译器不理解单例的概念。它不知道sharedInstance
的生命周期有什么特别之处。所以它只是因为你将self
设置为单身而与块无关。