• Object-c中间initialize 与 辛格尔顿


    简单说下initialize任务。在初始化过程中同样的类将被调用一次。

    直接在代码解释initialize任务。

    创建一个InitTest类

    InitTest.m

    #import "InitTest.h"
    
    @implementation InitTest
    + (void)initialize
    {
        NSLog(@"InitTest : initialize className : %@",[self class]);
        
    }
    
    - (id)init{
        self = [super init];
        if (self) {
            
            NSLog(@"InitTest : init");
            
        }
        return self;
    }
    
    @end
    

    再创建一个InitTest的子类InitTestChild


    以下我们来做个实验。在ViewController.m中的viewDidLoad加入例如以下代码

    InitTest *iTest = [[InitTest alloc] init];
        InitTest *iTest1 = [[InitTest alloc] init];
        InitTest *iTest2 = [[InitTest alloc] init];
        InitTestChild *child = [[InitTestChild alloc] init];

    结果


    发现父类的initialize调用一次。子类的调用一次。那么我们想一想假设在其它类创建呢?initialize会反复调用吗?我们创建一个新的视图控制器。SecondeVC

    SecondeVC.m

    #import "SecondeVC.h"
    #import "InitTest.h"
    
    @implementation SecondeVC
    
    - (void)viewDidLoad
    {
        [super viewDidLoad];
        NSLog(@"測试一下。在其它类初始化会不会调用 initialize函数");
        InitTest *iTest = [[InitTest alloc] init];
        InitTest *iTest1 = [[InitTest alloc] init];
        InitTest *iTest2 = [[InitTest alloc] init];
        NSLog(@"事实证明不会。这里好像提前剧透啦");
        
    }
    @end

    在ViewController.m中viewDidLoad的最以下加入例如以下代码:

    UIButton * btn = [UIButton buttonWithType:UIButtonTypeRoundedRect];
        [btn setTitle:@"跳转" forState:UIControlStateNormal];
        btn.frame = CGRectMake(0, 0, 100, 50);
        [btn setTitleColor:[UIColor blackColor] forState:UIControlStateNormal];
        [btn addTarget:self action:@selector(test) forControlEvents:UIControlEventTouchUpInside];
        [self.view addSubview:btn];

    实现跳转方法:

    - (void)test
    {
        [self presentViewController:[[SecondeVC alloc] init] animated:YES completion:^{
            
        }];
    }

    结果:


    依据以上的实验,表明initialize仅仅会调用一次,所以我们在单例的创建时能够利用其这种特性。

    单例能够这样写:

    static InitTest *initTest = nil;
    
    @implementation InitTest
    + (void)initialize
    {
        NSLog(@"InitTest : initialize className : %@",[self class]);
        if (initTest == nil) {
            initTest = [[InitTest alloc] init];
        }
    }
    + (InitTest *)defaultManager
    {
        return initTest;
    }

    本文代码:http://pan.baidu.com/s/1sjpxhSD
    原文:http://blog.csdn.net/qqmcy/article/details/41941429






    版权声明:本文博主原创文章,博客,未经同意不得转载。

  • 相关阅读:
    浅谈GET和POST请求方式
    浅淡建立bitmap实例
    从.NET1.1升级到.NET2.0时出现的PInvokeStackImbalance错误
    为RichTextBox添加快捷功能菜单(复制,粘贴,全选等)
    针对解决sql server数据库中不区分大小写问题.
    <转>用C#创建可拖动窗体
    如何:对 Windows 窗体控件进行线程安全调用
    正则
    <转>反射的第二部分:Emit
    『励志』一些普通又具有深刻哲理的警句(转载)
  • 原文地址:https://www.cnblogs.com/zfyouxi/p/4810281.html
Copyright © 2020-2023  润新知