你以为避免 block 循环引用只要 weakself就好了?

Block 循环引用怎么处理?只要把Block里面的self改成weakSelf就好了吗?navie了大兄弟。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43

@interface RenderEngine:NSObject

- property (nonatomic, copy) (void (^)(OreoView *view)) finish;

@end

@implemtation RenderEngine
// ...
@end

@interface OreoView:UIView

@property (nonatomic, strong) RenderEngine *engine;

@end

@implemtation OreoView

- (void)dealloc {
[_engine destroy];
}

@end


@interface Oreo: NSObject
+ (void)getViewById:(NSString*)id finish:(void (^)(OreoView *view))finish;
@end
@implemtation Oreo

+ (void)getViewById:(NSString*)id finish:(void (^)(OreoView *view))finish {
RenderEngine *engine = [RenderEngine new];
engine.finish = finish;
// 渲染Oreo视图
// ...
OreoView *view = ...;
view.engine = engine;
if (engine.finish) {
engine.finish(view);
}
}
@end

RenderEngine 是一个视图渲染引擎(Weex), RenderEngine 会去渲染视图,渲染是一个异步操作,所以它会持有一个结束回调finish,渲染出来的这个视图会持有这个渲染引擎,在视图释放时释放引擎。假如你这么写finish回调,那么retain cycle就来了。

1
2
3
4
5

Obj someObj = [Obj new];
[Oreo getViewById:@"123" finish:(OreoView *view) {
someObj.view = view;
}];

即时VC被释放了,someObj也不会被释放。所以用block时只考虑self就够了吗。 😁
Block里面只要用到了外部对象都有可能引起 retain cycle。