多线程:一次性执行

来源:互联网 发布:知乎炸鱼为业 编辑:程序博客网 时间:2024/04/28 19:03
////  ViewController.m//  13-一次性执行////  Created by gzxzmac on 16/1/29.//  Copyright © 2016年 gzxzmac. All rights reserved.//#import "ViewController.h"#import "CZTool.h"@interface ViewController ()@end@implementation ViewController- (void)viewDidLoad {    [super viewDidLoad];    static dispatch_once_t onceToken;    dispatch_once(&onceToken, ^{        // 设置导航栏样式    });}- (void)touchesBegan:(NSSet<UITouch *> *)touches withEvent:(UIEvent *)event {   /*    CZTool *tool0 = [CZTool shareTool];    CZTool *tool1 = [CZTool shareTool];    CZTool *tool2 = [CZTool shareTool];    CZTool *tool3 = [CZTool shareTool];    NSLog(@"%@ , %@ , %@ , %@",tool0, tool1, tool2, tool3);    CZTool *tool4 = [CZTool syncTool];    CZTool *tool5 = [CZTool syncTool];    CZTool *tool6 = [CZTool syncTool];    NSLog(@"%@, %@ , %@",tool4, tool5, tool6);    */    CFAbsoluteTime start = CFAbsoluteTimeGetCurrent();    for (int i = 0; i < 1000 * 1000; ++i) {      CZTool *tool = [CZTool shareTool];    }    NSLog(@"一次性执行的单例 : %f",CFAbsoluteTimeGetCurrent() - start);    start = CFAbsoluteTimeGetCurrent();    for (int i = 0; i < 1000 * 1000; ++i) {        CZTool *tool = [CZTool syncTool];    }    NSLog(@"互斥锁的单例 : %f",CFAbsoluteTimeGetCurrent() - start);}- (void)onceDemo {    NSLog(@"start");    static dispatch_once_t onceToken;    // 当 onceToken 是 0 的时候才会执行block 里面的代码    //    NSLog(@"默认值%ld",onceToken);    static NSObject *obj;    //    static NSString *ID = @"Cell";    dispatch_once(&onceToken, ^{        // 写一次性执行的代码        NSLog(@"真的是一次吗?");        obj = [[NSObject alloc]init];    });    NSLog(@"%@",obj);    //    NSLog(@"%ld",onceToken);    NSLog(@"end");    /*     static dispatch_once_t onceToken;     dispatch_once(&onceToken, ^{        // 放一次性执行的代码     });     */}@end
#import <Foundation/Foundation.h>/* 1. 此类在程序中只有一个对象 2. 有提供类方法来获取单例对象 */@interface CZTool : NSObject+ (instancetype)shareTool; // 使用一次性执行来实现单例+ (instancetype)syncTool;// 使用 互斥锁 来实现单例@end#import "CZTool.h"@implementation CZTool// 工作中单例通常使用一次性执行来完成+ (instancetype)shareTool {    static dispatch_once_t onceToken;    // 通常(写明确的类型也可以)    static id instance;    // 内部也有锁,性能比互斥锁要高    dispatch_once(&onceToken, ^{        instance = [[self alloc]init];    });    return instance;}// 之前有看到提供重置单例+ (instancetype)syncTool {    static id instance;    // 在同一时间内,只会执行一次    @synchronized(self) {        // 同一时间,只有一个调用会来到这里        if (instance == nil) {            instance = [[self alloc]init];        }    }    return instance;}@end
#import <Foundation/Foundation.h>@interface CZTest : NSObject@end#import "CZTest.h"@implementation CZTeststatic dispatch_once_t onceToken;// 通常(写明确的类型也可以)static id instance;+ (instancetype)shareTool {    // 内部也有锁,性能比互斥锁要高    dispatch_once(&onceToken, ^{        instance = [[self alloc]init];    });    return instance;}// 之前有看到提供重置单例(CoreData)+ (void)reset {    onceToken = 0;    instance = nil;}@end
0 0
原创粉丝点击