Ios 单例是否在块内创建保留循环?

Ios 单例是否在块内创建保留循环?,ios,objective-c,cocoa,singleton,objective-c-blocks,Ios,Objective C,Cocoa,Singleton,Objective C Blocks,我有一个单身汉,我想在一个街区内捕捉它。我知道变量被保留在块中,因为传递的对象的常量副本被创建,并且永远不会释放,除非使用该对象的弱实例。我好奇的是,是否将相同的行为应用于静态分配的变量。 这是我的代码(self是类的sharedInstance): 您声称“已创建传递对象的常量副本”是不正确的。该块创建对其使用的对象的\uuuuu strong或\uuuuu弱或\uuuu不安全\u未恢复的引用;它不会复制对象 代码会在self和块对象之间创建一个保留循环,因为块对self具有强引用,并且(假设

我有一个单身汉,我想在一个街区内捕捉它。我知道变量被保留在块中,因为传递的对象的常量副本被创建,并且永远不会释放,除非使用该对象的弱实例。我好奇的是,是否将相同的行为应用于静态分配的变量。 这是我的代码(self是类的sharedInstance):


您声称“已创建传递对象的常量副本”是不正确的。该块创建对其使用的对象的
\uuuuu strong
\uuuuu弱
\uuuu不安全\u未恢复的
引用;它不会复制对象

代码会在
self
和块对象之间创建一个保留循环,因为块对self具有强引用,并且(假设
self.property
为强)
self
对块具有强引用


编译器不理解单例的概念。它不知道
sharedInstance
的生命周期有什么特别之处。因此,它不会因为您将
self
设置为单体而对块做任何改变。

是的,块将永远保留单体!但单身汉永远都会留在记忆中。所以,没有什么可以释放的。因此,如果self对象是单态对象,则绝对没有理由使用weakSelf。单身汉是永远存在于记忆中的对象

这并不完全是块的工作方式,但是是的,与任何其他对象一样,同样的行为也适用于您的单例。当您在块内使用对象引用时,将复制引用,从而将ARC使用的引用计数加上+1(当您的引用为强引用时)。它不会复制对象本身。复制弱引用不会增加引用计数。我理解。回答得很好。谢谢。非常感谢。块捕获的复制引用与块本身具有相同的生存期。当该引用还有一个对引用它的块的引用时。。。好的,你有一个保留周期。是的,这引入了一个强大的参考周期(以前称为保留周期)的
self
,singleton。但是你的单件从来没有被释放过,所以这不是任何泄漏的来源。尽管如此,我还是倾向于使用
weakSelf
模式,以防以后将此对象用作单例以外的对象。+1 Tho,通常是
self。属性
定义为
copy
,而不是
strong
,但你的观点仍然适用,因为它仍然保持对捕获变量的强引用。问题是关于“自我”的生命周期,正如它是关于强属性和弱属性一样。没有保留周期,因为强引用不会导致泄漏。我同意没有泄漏,因为
sharedInstance
是对象图的根,
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];
    }];