我是否必须连续声明弱引用以中断块内块的保留周期?
__weak typeof(self) weakSelf = self;
[self setMyBlock:^(id obj, NSUInteger idx, BOOL *stop) {
typeof(self) strongSelf = weakSelf;
[strongSelf doSomething];
[strongSelf setMyBlock:^(id obj, NSUInteger idx, BOOL *stop) {
//do I need to create another weak reference to strongSelf for this block?
[strongSelf doSomething];
}];
}];
答案 0 :(得分:6)
我很害怕。 [strongSelf setMyBlock:<inner block>]
会导致self
保留内部区块。如果内部块具有对self
的强引用,那么这是一个循环。 strongSelf
变量从 __weak
限定变量中分配的事实最初没有任何区别。
正如其他一些用户所提到的,您可以使用原始weakSelf
而不是创建新的strongSelf
。您在块中创建self
引用的原因是,在块运行时可能会释放strongSelf
nil
。 self
将以strongSelf
结束{如果self
在self
被分配之前被解除分配,但这不会造成任何伤害),否则weakSelf
将不在块执行时被释放,因为你有一个强引用。在您强烈引用self
期间,原始public class MyObjectIdComparator implements Comparator<MyObject> {
@Override
public int compare (MyObject a, MyObject b) {
return a.getId().compareTo(b.getId());
}
}
ArrayList<MyObject> orig = getListFromSomewhere();
ArrayList<MyObject> sorted = new ArrayList<>(orig);
Collections.sort (sorted, new MyObjectIdComparator());
assertEquals ("orig list is in the wrong order, sorted, orig);
也可以安全使用,因为"devDependencies": {
"ejs": "^2.3.1",
"express": "^4.10.6",
"mysql": "^2.5.4"
},
"dependencies": {
"less": "^2.5.1",
"less-middleware": "^2.0.1"
}
将不会被释放。