使用@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;
}
答案 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;
}
正如您在上面所看到的,您只需要使用一次弱化。一旦定义,它就是为整个范围定义的。
同样,强化只需要一次阻止。此外,它需要在块的顶部,以便您尽快重新获取弱引用作为强引用。
在你的例子中使用它时,捕获的对自我的弱引用可能超出了范围。