1

我使用的Xcode 5和有一些代碼爲什麼保留循環警告不被拋出?

@interface Controller { 
    __weak IBOutlet UIView *someView; 
} 

@implementation Controller { 

- (void)doSomething 
{ 
    [UIView animateWithDuration:0.5 animations:^{ 
     someView.hidden = YES; 
    }]; 
} 

- (void)doSomething1 
{ 
    [UIView animateWithDuration:0.5 animations:^{ 
     [self doSomething]; 
    }]; 
} 

爲什麼保留週期警告不扔呢?我是否應該在每次使用self時使用弱引用我在塊中使用self

此外,我啓用了Implicit retain of self within blocks警告,它給了我100個警告,建議以self->ivar.prop(而不是ivar.prop)爲單位。我應該這樣做後,默認禁用警告?

回答

4

爲什麼保留甩不存在週期的警告?

塊會保留你,但你不保留塊。它會在動畫完成後被銷燬。所以,沒有周期。

我應該在自己每次使用self時使用弱引用嗎?

如果你的區塊沒有被自動銷燬(例如循環定時器),那麼你應該。

我應該這樣做後,默認禁用警告?

取決於上下文。同樣,如果您的街區長時間居住,您可能需要申報非保留的weakSelf

但基本上你很好,如果你的塊沒有得到保存的地方。

參見How do I avoid capturing self in blocks when implementing an API?

+0

感謝您的澄清。我錯過了只有在存儲時才保留該塊。 – efpies

+0

塊是「長壽命」意味着什麼?所有塊都有有限數量的代碼行,因此它最終會退出。 – Pwner

3

這不是保留週期。這是在循環中互相調用的兩種方法。當兩個對象實例相互之間強烈(保留)的引用永遠不會被破壞,並且這兩個對象不必要地保留在內存中時,會發生保留週期。

示例,代碼:Retain cycle in ARC

0

我應該用我的每塊使用自我時間自我弱引用?

絕對不是。塊保留捕獲的對象指針 - 出於某種原因 - 保持對象活動直到它們在塊運行時仍然在那裏。如果沒有保留週期,並且沒有其他事物保留對self指向的對象的引用,則可以在塊運行之前解除分配(例如,異步)。

相關問題