我将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 :(得分: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 …