2012-02-22 64 views
3

保留我有一個NSUInteger定義爲像這樣的屬性:更新塊內的NSUInteger屬性。警告:塊將由

@property (nonatomic, assign) NSUInteger wordDisplayed; 

我需要有此作爲一個屬性,因爲我需要訪問讀/寫來自其它方法這個變量和類。

在嘗試塊內改變這個屬性的值,我得到以下警告:

捕獲的「自我」強烈該塊很可能會導致保留週期

」塊將由被捕獲對象強烈保留的對象保留「

如何更新塊中的此變量屬性?

我使用的塊位於修改後的UIActionSheet中,用於使UIActionSheet接受塊。

https://github.com/zoul/Lambda-Alert

這裏是我的代碼示例:

sectionHeadersAct = [[LambdaSheet alloc] initWithTitle:@"Book 2 Lesson 1"]; 
    [sectionHeadersAct addButtonWithTitle:@"D. E. F. & G. Teach New Letters" block:^{ 
     wordDisplayed = 15; //This is where I'm trying to change the value 
    }]; 

[sectionHeadersAct showInView:self.view]; 
+0

類似問題http://stackoverflow.com/questions/8159274/ios-5- twitter-framework-completionhandler-block-capturing-self-strong -i – JiaYow 2012-02-22 00:26:48

回答

4

這篇文章論述了這個特定的問題:https://stackoverflow.com/a/8159567/656036

要總結一下:你應該使用一個弱指針自我。如果使用ARC,你可以通過你的塊之前寫這解決這個問題:

__weak MyObject *weakSelf = self; 

而且使用weakSelf而不是塊本身的自我。使用塊時

__weak ViewController *weakSelf = self; 
sectionHeadersAct = [[LambdaSheet alloc] initWithTitle:@"Book 2 Lesson 1"]; 
[sectionHeadersAct addButtonWithTitle:@"D. E. F. & G. Teach New Letters" block:^{ 
    weakSelf.wordDisplayed = 15; 
}]; 

[sectionHeadersAct showInView:self.view]; 
+0

「MyObject」會是什麼? – Jason 2012-02-22 00:44:28

+0

'self'代表什麼。通常是一個'UIViewController'類。在我的文章中更新了班級名稱。 – fscheidl 2012-02-22 00:46:33

+1

謝謝!這工作,我學到了一些新東西。該對象是一個UIViewController,但使用UIViewController不起作用。我用我所在的類的名稱替換了UIViewController。「MainViewController」並且工作正常。再次感謝! :) – Jason 2012-02-22 00:50:29

3

這是一種常見的發生:

EDIT嘗試此。我假設你正在通過self.wordDispalyed之類的東西訪問該地塊。

因爲塊可以異步運行,所以它們持有對它們內部對象的強引用。這是因爲如果它們在釋放對象後的某個時間運行,至少該塊仍然可以向其發送消息。

就你而言,你引用了塊內的一個屬性。所以塊保留這個對象,在這個例子中是self。但是,您的對象(self)也會保留該塊,因爲它必須運行它。所以你有一個循環引用。該塊保留該對象,並且該對象保留該塊。這可能會導致你的問題 - 編譯器警告你這一點。

爲了解決這個問題,你需要創建一個局部變量,該塊很好地保留,並用它來引用屬性。這是一個簡單的寫:

__weak TheObject *blockSelf = self; 

然後你的區塊內你處理財產:

blockSelf.wordDisplayed …