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.控制器中的代理属性一定要是弱引用,不要强引用。

你可能感兴趣的:(ios移动应用开发)