【问题标题】:Objective-c: UIView animate + block + recursionObjective-c:UIView动画+块+递归
【发布时间】:2013-11-20 03:46:26
【问题描述】:
    #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);

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

如何解决这个问题?

【问题讨论】:

    标签: objective-c recursion block objective-c-blocks


    【解决方案1】:

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

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

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

        myBlock blockStrong;
        __block __weak myBlock blockWeak;
        blockWeak = blockString = ^(int bn)
        {
            NSLog(@"%d", bn);
            if(bn < 10)
            {
                [self getData:blockWeak num:++bn];
            }
        };
    

    【讨论】:

    • 在这个块内引用 self 不会导致这里也有一个保留周期吗?
    • @danielbeard:不,因为self 没有任何地方保留这个块。你在哪里看到“循环”?
    猜你喜欢
    • 1970-01-01
    • 2015-11-22
    • 1970-01-01
    • 1970-01-01
    • 2012-02-10
    • 2016-03-15
    • 1970-01-01
    • 2012-11-11
    • 2012-03-07
    相关资源
    最近更新 更多