一次性代码(单例)

//  CZTool.h

一次性代码

#import <Foundation/Foundation.h>

@interface CZTool : NSObject

// 用单例设计模式,可以节省内存.

// 书写单例

// 1. 对外提供一个获取单例对象的接口(API)

+(instancetype)sharedCZTool;

@end

//  CZTool.m

一次性代码

#import "CZTool.h"

@implementation CZTool

// 定义一个全局的变量来接受创建好的单例对象.

// 目的:为了使其他方法再次创建对象的时候,直接返回这个单例对象

static id _instance;

+(instancetype)sharedCZTool

{

// 一次性代码中的代码,只能够被执行一次.

static dispatch_once_t onceToken;

dispatch_once(&onceToken, ^{

_instance = [[self alloc] init];

});

//  _instance = [[self alloc] init];

return _instance;

}

// 当调用 alloc init 方法之后,内部都会调用这个方法.

//+(instancetype)allocWithZone:(struct _NSZone *)zone

//{

//    static dispatch_once_t onceToken;

//    dispatch_once(&onceToken, ^{

//

//        _instance = [super allocWithZone:zone];

//

//    });

//

//    return _instance;

//}

@end

//  ViewController.m

一次性代码

#import "ViewController.h"

#import "CZTool.h"

@interface ViewController ()

@property (nonatomic,assign) BOOL is_onceTime;

@end

@implementation ViewController

- (void)viewDidLoad {

[super viewDidLoad];

self.is_onceTime = YES;

}

- (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event

{

CZTool *tool1 = [CZTool sharedCZTool];

CZTool *tool2 = [CZTool sharedCZTool];

CZTool *tool3 = [CZTool sharedCZTool];

CZTool *tool4 = [CZTool sharedCZTool];

CZTool *tool = [[CZTool alloc] init];

NSLog(@"%@,%@,%@,%@,%@",tool1,tool2,tool3,tool4,tool);

}

- (void)onceTime

{

// 实际开发中,GCD提供了一次性代码的函数.是线程安全的一次性代码.

dispatch_async(dispatch_get_global_queue(0, 0), ^{

[self test2];

});

[self performSelectorInBackground:@selector(test2) withObject:nil];

[NSThread detachNewThreadSelector:@selector(test2) toTarget:self withObject:nil];

[self test2];

}

// GCD中的一次性代码,需要掌握.

// 在写单例的时候,经常使用.

// 最简单的实现单例设计模式的方法.

- (void)test2

{

static dispatch_once_t onceToken;

dispatch_once(&onceToken, ^{

NSLog(@"一次性代码,只执行一次");

});

}

- (void)isOnceTime

{

dispatch_async(dispatch_get_global_queue(0, 0), ^{

[self test];

});

[self performSelectorInBackground:@selector(test) withObject:nil];

[NSThread detachNewThreadSelector:@selector(test) toTarget:self withObject:nil];

[self test];

}

// 如果使用Bool值做判断,为了保证线程安全,必须加锁.

- (void)test

{

@synchronized(self)

{

if (self.is_onceTime) {

NSLog(@"一次性代码,只执行一次");

self.is_onceTime = NO;

}

}

}

@end

时间: 2024-10-24 12:47:36

一次性代码(单例)的相关文章

单例在多线程中的使用

一次执行  dispatch_once: 对应的代码只执行一次 , 并且它是线程安全的, 系统会自动这个函数加锁,保存同一时间只有一个线程去执行任务, 实现真正意义的一次性执行 什么时候需要用到一次性执行:  单例 单例: 就是在程序运行期间,只有一个实例化对象  ---- 举例:音乐播放器的App, 同时只能播放一首歌曲. 好处: 如果不使用同一个播放管理器对象, 那就播放下一首歌曲时, 先销毁上一个对象, 再创建一个新对象 这样做就比较消耗资源. 既然同一个时刻只能播放一首歌曲 ,所以我们只

单例设计模式的简单实用

一次执行  dispatch_once: 对应的代码只执行一次 , 并且它是线程安全的, 系统会自动这个函数加锁,保存同一时间只有一个线程去执行任务, 实现真正意义的一次性执行什么时候需要用到一次性执行:  单例单例:就是在程序运行期间,只有一个实例化对象  ----    举例:音乐播放器的App, 同时只能播放一首歌曲.    好处: 如果不使用同一个播放管理器对象, 那就播放下一首歌曲时, 先销毁上一个对象, 再创建一个新对象            这样做就比较消耗资源.         

OC中的单例

概念 1 单例模式的意图是类的对象称为系统中唯一的实例,提供一个访问点,供客户类共享资源 什么情况下使用单例 1 1)类只能由一个实例,而且必须从一个为人熟知的访问点对其进行访问,比如工厂方法 2 2)这个唯一的实例只能通过子类化进行扩展,而且扩展的对象不会破坏客户端代码 单例设计模式的要点 1 1)某个类只能有一个实例 2 2)他必须自行创建这个对象 3 3)必须自行向整个系统提供这个实例 4 4)为了保证实例的唯一性,我们必须将 5 -(id) copyWithZone:(NSZone *)

设计模式:简单工厂和单例工厂

1 <?php 2 /** 3 * 纯粹工厂类 4 */ 5 /*class Factory { 6 public static function getOBJ($class_name) { 7 include_once './'.$class_name.'.class.php'; 8 return new $class_name; //可变类 9 } 10 } 11 */ 12 13 /** 14 * cun工厂类 15 */ 16 class Factory { 17 /* 18 生产单例对

单例的写法

1. #import "MySingleton.h" static MySingleton *_singleton = nil; + (id)shareObject { @synchronized(self){ if (_singleton == nil) { _singleton = [[MySingleton alloc] init]; } } return _singleton; } @end @synchronized 的作用是创建一个互斥锁,保证此时没有其它线程对self对象

简单多线程和单例学习例一

这是一个简单的面试题: 写一个简单的单例和多线程结合的例子; 代码: 单例代码: public class Singleton { private int i = 0; //在类内部实例化单例, 将会在虚拟机启动加载类的时候加载该静态实例 private static Singleton singleton = new Singleton(); //自由化构造函数,以确保不会被外部类实例化 private Singleton() { System.out.println("初始化单例!"

网络加载数据及单例工具类的代码抽取

今天给大家分享一一下网络加载数据:先看代码吧-------------------------- - (void)diseaseNumWithFinishedBlock:(FinishedBlocks)finishedBlock{ NSString *urlStr = @"http://数据接口"; NSDictionary *prama = @{响应参数}; [[NetWorkTool sharedNetWorkTool] POST:urlStr parameters:prama p

iOS 页面跳转传值,属性传值,代理传值,代码块传值,单例传值,通知传值

有时候我们在页面跳转的时候回传递相应的参数,如,你想把在第一个页面的文本框里的内容显示在第二个文本框中,或者你又想把第二个文本框中的内容改变之后到第一个页面的文本框中,所有,这个时候我们就要用到页面跳转传值 1.属性传值(正向传值) 属性传值是正向传值,只可以从前面一个页面传递到第二个页面,不可以从第二个页面传递到第一个页面 2.代理传值(逆向传值) 代理传值是逆向传值 代理传值步骤 代理传值 适用于 反向传值 1.1 创建协议 及协议方法 在反向传值的页面(SecondViewControll

iOS开发:XCTest单元测试(附上一个单例的测试代码)

测试驱动开发并不是一个很新鲜的概念了.在我最开始学习程序编写时,最喜欢干的事情就是编写一段代码,然后运行观察结果是否正确.我所学习第一门语言是c语言,用的最多的是在算法设计上,那时候最常做的事情就是编写了一段代码,如何编译运行,查看结果是否正确,很多时候,还得自己想很多特殊的(比如说零值,边界值)测试数据来检测所写代码.算法是否正确.那个时候,感觉还好,比较输出只是只是控制台的一个简单的数字或者字符.在学习iOS开发中,很多时候也是要测试的,这种输出是必须在点击一系列按钮之后才能在屏幕上显示出来