iOS代理模式注意事项

之前写的又一篇博客,说两个页面ab页面,当b页面成为a页面的代理之后,那么即使b页面在返回之后,也会继续调用代理方法,主要是因为b成为a的代理之后,则b不会在被回收,这样容易造成内存泄漏,那么如何解决呢。
其实很简单,我们只需要在b的dealloc中释放代理就行了b.delegate = nil;

但是有的时候我们的b页面dealloc不走,那么这就需要我们检查页面是否存在内存泄漏了,主要从以下三个方面检查:
1.一.block块使用不当。因为block会对方法中的变量自动retain一次。请检查控制器中block代码。
例如在block里 直接调用实例变量:假如你这个类叫OneViewController,有个属性是NSString name; 如果你在block体中使用了self.name,那样子的话这个类就没法释放。要解决这个问题,MRC下只需__block Viewcontroller *weakSelf = self; *ARC下将__block 换为 __weak。
或者在block里这样直接使用self也是错的
[self.webView stringByEvaluatingJavaScriptFromString:jsMyAlert];
改为 :
__weak EH_WebViewController* weakSelf=self;
[weakSelf.webView stringByEvaluatingJavaScriptFromString:jsMyAlert];这样就行了
2。NSTimer没有销毁。在viewWillDisappear之前需要把控制器用到的NSTimer销毁。用到定时器的时候,我们需要在viewWillDisappear之前销毁或者在定时器走完之后销毁。例如:

@property(nonatomic,strong)NSTimer *mytimer;

例如好多注册按钮,多少秒后重新发送验证码,例如60秒那么在60秒走完之后我们就可以执行下面方法,如果我们不需要走完60秒,那么就可以在viewWillDisappear之前就调用。
//要先释放 在清空
 theTimer=nil;
 [self.mytimer invalidate];
 self.mytimer=nil;

3.注册通知。

    [[NSNotificationCenter defaultCenter]addObserver:self selector:@selector(textChange) name:UITextFieldTextDidChangeNotification object:textfield];
-(void)dealloc
{
    [[NSNotificationCenter defaultCenter] removeObserver:self];
}

4.控制器中的代理属性一定要是弱引用,不要强引用。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值