Possible to pass [self anyFunction] in blocks without __weak object (iOS 5 + ARC)

后端 未结 2 747
心在旅途
心在旅途 2020-12-12 19:26

Is it possible to pass [self anyFunction] in blocks without a __weak object from self?

As an example this is valid code from the System Framework:

[U         


        
2条回答
  •  情话喂你
    2020-12-12 20:10

    The blocks which throw up the error are ones where you capture the objects that own the block. For example

    [object performBlock:^{
        [object performSomeAction]; // Will raise a warning
    }];
    

    or

    [self performBlock:^{
        [self doSomething];    // Will raise a warning
    }];
    

    but

    [self performBlock:^{
        [object doSomething];    // <-- No problem here
    }];   
    

    Because an object retains its blocks, and a block retains it's objects. So in both these cases, the object which performs the block owns the block, which also owns the object. So you have a loop - a retain cycle. which means the memory is leaked.

    In the example you have given - you're looking at a class method. You're calling the block on a UIView class, not a UIView object. A class has no memory associated with it. And you are probably calling this function from a controller, so the self reference is being retained by the block, but there is no loop because self is not retaining the block.

    In the same way that, you may have noticed, not all objects that are used in the block need to be weakly referenced - just the ones that cause a retain cycle.

提交回复
热议问题