2014-11-06 51 views
1

我有一个单身人士,我想在一个块内捕获它。我知道变量保留在块内部,因为传递的对象的常量拷贝被创建,并且除非使用该对象的弱实例,否则永远不会解除分配。我的好奇心是相同的行为是否适用于静态分配的变量。 这里是我的代码(self是类的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]; 
    }]; 
+1

这不是_exactly_块如何工作,但是,同样的行为适用于您的单身人士作为任何其他对象。 – CrimsonChris 2014-11-06 18:52:09

+0

在块内使用对象引用时,_reference_被复制,它将ARC添加到引用计数的+1(当引用强时)。它并不复制对象本身。复制弱引用不会增加引用计数。 – CrimsonChris 2014-11-06 18:54:44

+0

我明白了。非常好的答案。欣赏它。谢谢! – 2014-11-06 18:58:02

回答

2

你声称“创建传递的对象的恒定副本”是不正确。该块创建对其使用的对象的引用__strong__weak__unsafe_unretained;它不会复制对象。

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

编译器不理解单例的概念。它不知道sharedInstance的寿命有什么特别之处。所以它不会因为你已经将self设置为单例而与块做任何不同的事情。

+0

+1 Tho通常'self.property'被定义为'copy'而不是'strong',但是你的观点仍然适用,因为它仍然保留对捕获变量的强引用。 – Rob 2014-11-06 19:19:42

+1

问题在于关于“自我”的生命周期,就像关于强弱属性一样。没有保留周期,因为强参考不会导致泄漏。 – 2016-06-21 04:31:20

+1

我同意没有泄漏,因为'sharedInstance'是对象图的根,'sharedInstance'引用了单例。然而,问题是(字面意义上)“一个singleton是否在块内部创建保留循环?”,并且在这种情况下,在单例和块之间确实存在保留循环。并非所有保留周期都是泄漏。 – 2016-06-21 04:37:24

2

是的,该块将永远保留单身人士!但单身人士总是会记忆中。所以,没有什么可以发布的。因此,如果自我对象是一个单身人士,那么完全没有理由使用weakSelf。单身人士是一个永远留在记忆中的物体。