保留块内块的循环

时间:2015-06-02 17:11:32

标签: ios objective-c objective-c-blocks

我是否必须连续声明弱引用以中断块内块的保留周期?

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

1 个答案:

答案 0 :(得分:6)

我很害怕。 [strongSelf setMyBlock:<inner block>]会导致self保留内部区块。如果内部块具有对self的强引用,那么这是一个循环。 strongSelf变量从 __weak限定变量中分配的事实最初没有任何区别。

正如其他一些用户所提到的,您可以使用原始weakSelf而不是创建新的strongSelf。您在块中创建self引用的原因是,在块运行时可能会释放strongSelf nilself将以strongSelf结束{如果selfself被分配之前被解除分配,但这不会造成任何伤害),否则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" } 将不会被释放。