1,在block 方法里面直接写代理 举例:
self.categoryView.selectedItemHelper = ^(NSUInteger index) {
//直接写代理
if (self.delegate && [self.delegate respondsToSelector:@selector(segmentedPageViewControllerDidEndDeceleratingWithPageIndex:)]) {
[self.delegate segmentedPageViewControllerDidEndDeceleratingWithPageIndex:index];
}
};
//解决办法 另写个方法在写代理方法
self.categoryView.selectedItemHelper = ^(NSUInteger index) {
//代理方法
[myselfdidEndDeceleratingWithPageIndex:index];
};
2,封装的view 传控制器 举例:
//注意点:如果searchView 里面的子view,或者其他view 也传popToVC了,例如:self.saomiaoView.popToVC=self.popToVC; 也要释放不然控制无法释放
@interface LLJFound_searchView : UIView
@property (nonatomic,strong)UIViewController * popToVC;
@end
//这样然后直接不管了,控制器得不到释放
- (void)viewDidLoad {
[super viewDidLoad];
self.searchView.popToVC = self;
}
解决办法
1,@property (nonatomic,weak)UIViewController * popToVC;//用weak 修饰vc,不用担心不能释放
2,不建议,还得手动至为nil
-(void)viewWillAppear:(BOOL)animated
{
[super viewWillAppear:animated];
self.searchView.popToVC = self;
[self.navigationController setNavigationBarHidden:YES animated:animated];
}
-(void)viewWillDisappear:(BOOL)animated
{
[super viewWillDisappear:animated]
//如果searchView 里面的子view,或者其他view 也传popToVC了,例如:self.saomiaoView.popToVC=self.popToVC; 也要释放不然控制无法释放
self.searchView.popToVC = nil; //必须释放vc 不然控制无法释放
self.searchView.saomiaoView = nil;//必须释放vc 不然控制无法释放
[self.navigationController setNavigationBarHidden:NO animated:animated];
}
3,block 内部打印 DLog(%@,"不能释放");
#ifdef DEBUG
#define DLog(...) NSLog(@"%s(%p) \n\t%@", __PRETTY_FUNCTION__, self, [NSString stringWithFormat:__VA_ARGS__])
#else
#define DLog(...)
#endif
因为 DEBUG 模式下 打印了当前控制器,导致block内部打印东西,控制器无法释放
4, 获取当前控制器,在tableviewCell里面,然后写push跳转。
会造成当前控制器无法释放
UIViewController *currentCtrl = [[UIApplication sharedApplication] currentViewController];
网友评论