目标c块在一个块中

时间:2015-03-08 07:26:51

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

这里有很多街区!

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

我创建了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);

2 个答案:

答案 0 :(得分:2)

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

因此,您需要在strongRecordBlock内部创建对weakRecordBlock的强引用。所以只需在strongRecordBlock

之上添加这行代码即可
 void (^strongPointerToWeakRecordBlock)(int i) = weakRecordBlock;

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

答案 1 :(得分:2)

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