设为首页 加入收藏

TOP

Object-c中的initialize 与 单例
2015-01-21 11:09:40 来源: 作者: 【 】 浏览:17
Tags: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<??http://www.2cto.com/kf/ware/vc/" target="_blank" class="keylink">vcD4KPHA+U2Vjb25kZVZDLm08YnI+CjwvcD4KPHA+PC9wPgo8cHJlIGNsYXNzPQ=="brush:java;">#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






】【打印繁体】【投稿】【收藏】 【推荐】【举报】【评论】 【关闭】 【返回顶部
分享到: 
上一篇C语言宏定义技巧――多次包含头文.. 下一篇OC学习篇之---循环引用问题

评论

帐  号: 密码: (新用户注册)
验 证 码:
表  情:
内  容: