程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> C語言 >> 關於C語言 >> Object-c中的initialize 與 單例

Object-c中的initialize 與 單例

編輯:關於C語言

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.Bkjia.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






  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved