更新块中的NSUInteger属性。警告:阻止将被保留

时间:2012-02-22 00:22:40

标签: iphone objective-c ios

我将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];

2 个答案:

答案 0 :(得分:4)

这篇文章涉及这个问题:https://stackoverflow.com/a/8159567/656036

总结一下:你应该使用弱指针指向self。如果你使用ARC,你可以通过在块之前写这个来解决这个问题:

__weak MyObject *weakSelf = self;

在块本身中使用weakSelf而不是self。

编辑试试这个:

__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];

答案 1 :(得分:3)

这在使用块时很常见。我假设您使用self.wordDispalyed之类的块访问该属性。

因为块可以异步运行,所以它们对它们内部的对象有强烈的引用。这样,如果它们在您释放对象后的某个时间运行,至少该块仍然可以向其发送消息。

在您的情况下,您正在引用块中的属性。因此块保留了对象,在本例中为self。但是,您的对象(self)也保留了块,因为它必须运行它。所以你有一个循环引用。块保留对象,对象保留块。这个可能会导致您出现问题 - 编译器会警告您这一点。

要解决此问题,您需要创建一个由块保留的局部变量,并使用它来引用该属性。写作很简单:

__weak TheObject *blockSelf = self;

然后在您的街区内,您将处理该物业:

blockSelf.wordDisplayed …