add __weak __block for retain cycle