单例是否在块内创建保留周期?

时间:2014-11-06 18:43:05

标签: ios objective-c cocoa singleton objective-c-blocks

我有一个单身人士,我想在一个街区内捕捉它。我知道变量保留在块中,因为传递的对象的常量副本是创建的,除非使用该对象的弱实例,否则永远不会释放。我的好奇心是相同的行为是否适用于静态分配的变量。 这是我的代码(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];
    }];

2 个答案:

答案 0 :(得分:3)

是的,该区块将永久保留单身人士!但是单身人士总是在记忆中。所以,没有什么可以发布的。因此,如果自我对象是单身,则绝对没有理由使用weakSelf。单身是一个永远存在于记忆中的对象。

答案 1 :(得分:2)

您声称“创建的对象的常量副本已创建”不正确。该块会对其使用的对象创建__strong__weak__unsafe_unretained个引用;它不会复制对象。

您的代码会在self和块对象之间创建一个保留周期,因为该块具有对self的强引用,并且(假设self.property很强)self具有强引用块。

编译器不理解单例的概念。它不知道sharedInstance的生命周期有什么特别之处。所以它只是因为你将self设置为单身而与块无关。