使用@weakify时会出现意外错误' @'在该计划中

时间:2014-08-14 12:00:31

标签: ios reactive-cocoa

使用@weakify时,程序中出现意外错误“@”。我错过了一些.h文件吗? 我已经导入了ReactiveCocoa.h。我有什么事要做吗?

- (id)initWithFrame:(CGRect)frame
{
    self = [super initWithFrame:frame];
    if (self) {
        // Initialization code
        _isSeperateFill = YES;
        _isBorderStroke = NO;
        _isSeperatedStroke = YES;

        _contentWidth = 0;

        @weakify(self);
        [RACObserve(self, dataVO) subscribeNext:^(TableDataVO* dataVO){
            if( dataVO ){
                NSString* indexKey = [[dataVO.tableDataDictionary allKeys] objectAtIndex:0];

                _keys = [dataVO.tableDataDictionary allKeys];
                @strongify(self);
                _rows = [[self.dataVO.tableDataDictionary objectForKey:indexKey] count];
                @strongify(self);
                [self.styleVO setTableHeaderLineHorizontalMargin:self.styleVO.tableWidth / [_keys count]];
            }
        }];

        @weakify(self);
        [RACObserve(self, styleVO) subscribeNext:^(TableStyleVO* styleVO){
            if( styleVO ){
                styleVO.tableHeaderLineHorizontalMargin = styleVO.tableWidth / [_keys count] / 2;
            }
        }];

    }
    return self;
}

2 个答案:

答案 0 :(得分:5)

@weakify@strongify和朋友属于libextobjc,而不是ReactiveCocoa

尝试添加此行(根据@chakming的评论):

#import "ReactiveCocoa/RACEXTScope.h"

或者对于2.3.1之前的ReactiveCocoa(我的原始答案),请使用:

#import <ReactiveCocoa/EXTScope.h>

答案 1 :(得分:1)

与手头的问题并不严格相关,但我认为我会评论并提及您使用和放置弱化和强化是不正确的。正确的版本将是......

- (id)initWithFrame:(CGRect)frame
{
    self = [super initWithFrame:frame];
    if (self) {
        // Initialization code
        _isSeperateFill = YES;
        _isBorderStroke = NO;
        _isSeperatedStroke = YES;

        _contentWidth = 0;

        @weakify(self);
        [RACObserve(self, dataVO) subscribeNext:^(TableDataVO* dataVO){
            @strongify(self);
            if( dataVO ){
                NSString* indexKey = [[dataVO.tableDataDictionary allKeys] objectAtIndex:0];
                _keys = [dataVO.tableDataDictionary allKeys];
                _rows = [[self.dataVO.tableDataDictionary objectForKey:indexKey] count];
                [self.styleVO setTableHeaderLineHorizontalMargin:self.styleVO.tableWidth / [_keys count]];
            }
        }];

        [RACObserve(self, styleVO) subscribeNext:^(TableStyleVO* styleVO){
            if( styleVO ){
                styleVO.tableHeaderLineHorizontalMargin = styleVO.tableWidth / [_keys count] / 2;
            }
        }];

    }
    return self;
}

正如您在上面所看到的,您只需要使用一次弱化。一旦定义,它就是为整个范围定义的。

同样,强化只需要一次阻止。此外,它需要在块的顶部,以便您尽快重新获取弱引用作为强引用。

在你的例子中使用它时,捕获的对自我的弱引用可能超出了范围。