2014-11-06 62 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。單身人士是一個永遠留在記憶中的物體。