2017-10-11 73 views
-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; 
} 

回答

0

由於redView具有參照SecondVC和SecondVC具有參照redView。你應該做weakSelf:

__weak typeof(self) weakSelf = self; 
RedView *redView = [[RedView alloc]initWithFrame:CGRectMake(40, 40, 40, 40)]; 
[redView setRedViewBlock:^{ 
    [weakSelf aSecondViewFunc]; 
}]; 
[self.view addSubview:redView]; 
+0

但是,redView是一個局部變量,如果redView沒有添加到SecondVC,它可以被釋放。所以SecondVC引用redView是因爲redView是Second's subView? – firmiana

+0

我認爲這不重要,它是「局部變量」。它作爲self.view的子視圖存在於內存中(其中self是您的SecondVC),因此在退出此代碼塊後不會釋放它。 –

+0

是啊,我明白,謝謝你 – firmiana