2
    #import "ViewController.h"

    typedef  void (^myBlock)(int );

    @interface ViewController ()

    @property (strong, nonatomic) IBOutlet UIView *testView;

    @end

    @implementation ViewController

    - (IBAction)blockTest:(id)sender
    {
        [self blockRecursion:0];
    }

    - (void)blockRecursion:(NSInteger)n
    {
        __weak myBlock __block block = ^(int bn)
        {
            NSLog(@"%d", bn);
            if(bn < 10)
            {
                [self getData:block num:++bn];
            }
        };

        block(0);
    }


    - (void)getData:(myBlock)block num:(NSInteger)bn
    {
        self.testView.alpha = 1;
        [UIView animateWithDuration:0.5 delay:0 options:UIViewAnimationOptionCurveEaseInOut animations:^{
            self.testView.alpha = 0;
        } completion:^(BOOL finished) {
            block(bn);
        }];
    }

    @end

运行崩溃:错误:地址不包含指向目标文件中的节的节

__weak myBlock __block block = ^(int bn);
//Changed to 
myBlock __block block = ^(int bn);

显示警告:在此块中强烈捕获“块”可能会导致保留周期

如何解决这个问题呢?

4

1 回答 1

0

您的代码的问题是没有对块对象的强引用。block是弱参考。因此,在创建块对象的语句之后,块对象可能会被释放,这会将__weak变量设置blocknil. 使用块指针调用块nil会崩溃。

当您删除 时__weak,您会创建一个保留循环——该块保留对自身的强引用。

你需要的是两个变量,一个强一个弱。该块捕获弱者。块捕获的内容需要__block反映块创建后的分配。

    myBlock blockStrong;
    __block __weak myBlock blockWeak;
    blockWeak = blockString = ^(int bn)
    {
        NSLog(@"%d", bn);
        if(bn < 10)
        {
            [self getData:blockWeak num:++bn];
        }
    };
于 2013-11-08T22:26:51.803 回答