【问题标题】:Objective c block in a block一个块中的目标c块
【发布时间】:2015-03-08 07:26:51
【问题描述】:

这里有很多块!

我正在尝试使用块对字典中存在的每条记录执行操作。

我创建了 strongRecordBlock 的弱引用,并使用它在 strongRecordBlock 中调用自身。一切正常,直到我介绍了我需要执行的实际操作(DataManager addRecord),这又是一个块。 所以现在有个异常,递归循环第一次迭代后weakRecordBlock为null。有没有人可以指导一下!

__weak __block void (^weakRecordBlock)(int i);

        void (^strongRecordBlock)(int) = ^(int i) {
            NSString *key = weakSelf.recordDictionary.allKeys[i];
            CSVRecord *record = [weakSelf.recordDictionary objectForKey:key];
            NSLog(@"%d %@", i, record.recordFullname);
            [[DataManager sharedInstance] addRecord:record onSuccess:^(NSString *objectId) {
                if (i < weakSelf.recordDictionary.allKeys.count-1) {
                    weakRecordBlock(i+1);//Crashes here
                }
                else {
                    completedBlock();
                }
            } onError:^(NSError *error) {
                onError(error);
            }];


        };
        weakRecordBlock = strongRecordBlock;
        strongRecordBlock(0);

【问题讨论】:

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


    【解决方案1】:

    问题是你试图在块内使用弱指针。它导致在第一次运行循环后实现弱点。

    所以你需要在 strongRecordBlock 内部创建对 weakRecordBlock 的强引用。所以只需在你的 strongRecordBlock 顶部添加这行代码

     void (^strongPointerToWeakRecordBlock)(int i) = weakRecordBlock;
    

    并将 weakRecordBlock(i+1) 替换为 strongPointerToWeakRecordBlock(i+1)

    【讨论】:

      【解决方案2】:

      RomanSalabay 的回答是正确的。问题是-[DataManager addRecord:record onSuccess:] 执行它的参数块异步。因此,该块(-[DataManager addRecord:record onSuccess:] 的参数)需要保持对其中使用的对象和块的强引用,以使它们在块运行之前保持活动状态;否则它们可以在块运行时被释放。但它捕获了一个弱引用 (weakRecordBlock)。它需要复制一个强引用。所以你应该将weak变量分配给外部块体中的一个强变量,让内部块捕获。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2010-10-31
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多