-1
我有一個塊保留週期問題。爲什麼物體不能被釋放?
1.查看演示,redView是一個本地var,只是一種「UIView」,當我彈出secondVC時,但是secondVC和redView不能被釋放。爲什麼?
@interface RedView : UIView
@property(nonatomic,copy) void (^redViewBlock)();
@end
@implementation SecondVC
- (void)viewDidLoad {
[super viewDidLoad];
self.view.backgroundColor = [UIColor whiteColor];
RedView *redView = [[RedView alloc]initWithFrame:CGRectMake(40, 40, 40, 40)];
[redView setRedViewBlock:^{
[self aSecondViewFunc];
}];
[self.view addSubview:redView];
}
-(void)aSecondViewFunc
{
}
2.I添加綠景secondVC和redView之間,綠景是一個全局變量,當我彈出secondVC,綠景和redView不能老是被釋放,但secondVC可以釋放。爲什麼?
@interface SecondVC()
@property(nonatomic,strong)GreenView *greenView;
@end
@implementation SecondVC
- (void)viewDidLoad {
[super viewDidLoad];
self.view.backgroundColor = [UIColor whiteColor];
self.greenView = [[GreenView alloc]initWithFrame:CGRectMake(200, 200, 200, 200)];
[self.view addSubview:self.greenView];
}
@implementation GreenView
-(instancetype)initWithFrame:(CGRect)frame
{
if (self = [super initWithFrame:frame]) {
self.backgroundColor = [UIColor greenColor];
RedView *redView = [[RedView alloc]initWithFrame:CGRectMake(0, 0, 40, 40)];
[redView setRedViewBlock:^{
[self justAFunc];
}];
[self addSubview:redView];
}
return self;
}
但是,redView是一個局部變量,如果redView沒有添加到SecondVC,它可以被釋放。所以SecondVC引用redView是因爲redView是Second's subView? – firmiana
我認爲這不重要,它是「局部變量」。它作爲self.view的子視圖存在於內存中(其中self是您的SecondVC),因此在退出此代碼塊後不會釋放它。 –
是啊,我明白,謝謝你 – firmiana