zoukankan      html  css  js  c++  java
  • ARC模式下delloc()注意事项

    ------------------------------------------------------------------------------------------------------------------------------------------------

     一. 有一次面试问到:从VC1 推到VC2会不会调用dealloc呢?答案是不会

    而从VC2 dismiss 会调VC2的dealloc 
    不会调用VC1的dealloc方法
    
    有代码为证:
    
    #import "ViewController.h"
    #import "ViewController2.h"
    @interface ViewController ()
    
    @end
    
    @implementation ViewController
    
    - (void)dealloc
    {
        NSLog(@"ViewController dealloc");
    }
    
    - (void)viewDidLoad {
        [super viewDidLoad];
        // Do any additional setup after loading the view, typically from a nib.
    }
    
    - (IBAction)goVC2:(id)sender {
        ViewController2 *vc2 = [ViewController2 new];
        [self presentViewController:vc2 animated:YES completion:^{
            
        }];
        
    }
    
    @end
    
    #import "ViewController2.h"
    
    @interface ViewController2 ()
    
    @end
    
    @implementation ViewController2
    
    - (void)dealloc
    {
        NSLog(@"ViewController2 dealloc");
    }
    
    - (void)viewDidLoad {
        [super viewDidLoad];
        // Do any additional setup after loading the view from its nib.
    }
    

    二. ViewController中被加入了定时器,而没有及时的invalidate ,会怎样?

    #import "ViewController.h"
    #import "ViewController2.h"
    @interface ViewController ()
    {
        NSTimer *timer;
    }
    @end
    
    @implementation ViewController
    
    - (void)dealloc
    {
        NSLog(@"ViewController dealloc %@",self);
    }
    
    - (void)viewDidLoad {
        [super viewDidLoad];
        // Do any additional setup after loading the view, typically from a nib.
        timer = [NSTimer scheduledTimerWithTimeInterval:3.0 target:self selector:@selector(updateTime:) userInfo:nil repeats:YES];
    }
    
    -(void)viewWillDisappear:(BOOL)animated
    {
        [super viewWillDisappear:animated];
        [timer invalidate];
    }
    
    -(void)updateTime:(id)sender
    {
        
        NSLog(@"ViewController updateTime");
    }
    
    - (IBAction)goVC2:(id)sender {
        ViewController2 *vc2 = [ViewController2 new];
        [self presentViewController:vc2 animated:YES completion:^{
            
        }];
        
    }
    
    @end
    

    没调 [timer invalidate]; 打印

    2020-02-29 17:23:04.608616+0800 YiJTApp[17656:482667] ViewController updateTime
    2020-02-29 17:23:07.608558+0800 YiJTApp[17656:482667] ViewController updateTime
    2020-02-29 17:23:10.607419+0800 YiJTApp[17656:482667] ViewController updateTime
    2020-02-29 17:23:13.608551+0800 YiJTApp[17656:482667] ViewController updateTime
    2020-02-29 17:23:16.608406+0800 YiJTApp[17656:482667] ViewController updateTime
    2020-02-29 17:23:19.608554+0800 YiJTApp[17656:482667] ViewController updateTime
    2020-02-29 17:23:22.608535+0800 YiJTApp[17656:482667] ViewController updateTime
    2020-02-29 17:23:25.409616+0800 YiJTApp[17656:482667] ViewController2 dealloc
    2020-02-29 17:23:25.607751+0800 YiJTApp[17656:482667] ViewController updateTime
    2020-02-29 17:23:28.608624+0800 YiJTApp[17656:482667] ViewController updateTime
    2020-02-29 17:23:31.607510+0800 YiJTApp[17656:482667] ViewController updateTime
    

     [timer invalidate]; 打印

    2020-02-29 17:26:12.271080+0800 YiJTApp[17763:485905] ViewController updateTime
    2020-02-29 17:26:23.268043+0800 YiJTApp[17763:485905] ViewController2 dealloc
    

    不管是有定时器,或者被代理,block强引用。VC1都不会调delloc方法。

    此文仅为鄙人学习笔记之用,朋友你来了,如有不明白或者建议又或者想给我指点一二,请私信我。liuw_flexi@163.com/QQ群:582039935. 我的gitHub: (学习代码都在gitHub) https://github.com/nwgdegitHub/
  • 相关阅读:
    Swift实现单例
    UIViewContentMode说明
    打开或关闭Mac的隐藏文件的命令。
    struts2-2.3.20以上版本无法正常启动
    eclipse下导入jdk源码
    js 与css script
    eclipse导入jquery包后报错
    ${pageContext.request.contextPath} :JSP取得绝对路径方法
    小米暑期实习在线笔试2015-04-25
    android动态污点分析
  • 原文地址:https://www.cnblogs.com/liuw-flexi/p/6742501.html
Copyright © 2011-2022 走看看