dispatch_once优化代码性能

有些变量只需要初始化一次(如从文件中读取配置参数,读取设备型号等等),可以使用dispatch_once来进行读取优化,保证只调用API一次,以后就只要直接访问变量即可

范例如下:

 

[objc] view plain copy 在CODE上查看代码片 派生到我的代码片
  1. static BOOL isTestMode;  
  2.   
  3. (BOOL)isTestMode  
  4.  
  5.     static dispatch_once_t onceToken;  
  6.     dispatch_once(&onceToken, ^{  
  7.         NSNumber* obj [[[NSBundle mainBundle] infoDictionary] objectForKey:@"CFResourceTest"];  
  8.         isTestMode [obj boolValue];  
  9.     });  
  10.      
  11.     return isTestMode;  
  12.  

无论是爱还是恨,你都需要单例。实际上每个iOS或Mac OS应用都至少会有 UIApplicationNSApplication.
什么是单例呢?Wikipedia是如此定义的:
在软件工程中,单例是一种用于实现单例的数学概念,即将类的实例化限制成仅一个对象的设计模式。
或者我的理解是:
单例是一种类,该类只能实例化一个对象。
      尽管这是单例的实际定义,但在Foundation框架中不一定是这样。比如 NSFileMangerNSNotificationCenter,分别通过它们的类方法 defaultManagerdefaultCenter获取。尽管不是严格意义的单例,这些类方法返回一个可以在应用的所有代码中访问到的类的共享实例。在本文中我们也会采用该方法。
      使用Objective-C实现单例模式的最佳方式向来有很多争论,开发者(包括Apple在内)似乎每几年就会改变他们的想法。当Apple引入了 Grand Central Dispatch (GCD)(Mac OS 10.6和iOS4.0),他们也引入了一个很适合用于实现单例模式的函数。
      该函数就是 dispatch_once
void dispatch_once( dispatch_once_t *predicate, dispatch_block_t block);
      该函数接收一个 dispatch_once用于检查该代码块是否已经被调度的谓词(是一个长整型,实际上作为 BOOL使用)。它还接收一个希望在应用的生命周期内仅被调度一次的代码块,对于本例就用于shared实例的实例化。
dispatch_once不仅意味着代码仅会被运行一次,而且还是线程安全的,这就意味着你不需要使用诸如 @synchronized之类的来防止使用多个线程或者队列时不同步的问题。
      Apple的 GCD Documentation证实了这一点:
如果被多个线程调用,该函数会同步等等直至代码块完成。
      实际要如何使用这些呢?
      好吧,假设有一个 AccountManager类,你想在整个应用中访问该类的共享实例。你可以按如下代码简单实现一个类方法:
+ (AccountManager *)sharedManager { 
      static AccountManager *sharedAccountManagerInst ance = nil; 
 static dispatch_once_t predicate;
  dispatch_once(&predicate, ^{             
                  sharedAccountManagerInst ance = [[self alloc] init]; 
        } );
    return sharedAccountManagerInst ance; 
}
      这就意味着你任何时候访问共享实例,需要做的仅是:
AccountManager *accountManager = [AccountManager sharedManager];
      就这些,你现在在应用中就有一个共享的实例,该实例只会被创建一次。
      该方法有很多优势: 
                    1 线程安全
                    2 很好满足静态分析器要求
                    3 和自动引用计数(ARC)兼容 
                    4 仅需要少量代码
    该方法的 劣势 就是它仍然运行创建一个非共享的实例:
AccountManager *accountManager = [[AccountManager alloc] init];
      有些时候你希望有这种行为,但如果正在想要的是仅一个实例被实例化就需要注意这点。
内容概要:该论文研究了一种基于行波理论的输电线路故障诊断方法。当输电线路发生故障时,故障点会产生向两侧传播的电流和电压行波。通过相模变换对三相电流行波解耦,利用解耦后独立模量间的关系确定故障类型和相别,再采用小波变换模极大值法标定行波波头,从而计算故障点距离。仿真结果表明,该方法能准确识别故障类型和相别,并对故障点定位具有高精度。研究使用MATLAB进行仿真验证,为输电线路故障诊断提供了有效解决方案。文中详细介绍了三相电流信号生成、相模变换(Clarke变换)、小波变换波头检测、故障诊断主流程以及结果可视化等步骤,并通过多个实例验证了方法的有效性和准确性。 适合人群:具备一定电力系统基础知识和编程能力的专业人士,特别是从事电力系统保护与控制领域的工程师和技术人员。 使用场景及目标:①适用于电力系统的故障检测与诊断;②能够快速准确地识别输电线路的故障类型、相别及故障点位置;③为电力系统的安全稳定运行提供技术支持,减少停电时间和损失。 其他说明:该方法不仅在理论上进行了深入探讨,还提供了完整的Python代码实现,便于读者理解和实践。此外,文中还讨论了行波理论的核心公式、三相线路行波解耦、行波测距实现等关键技术点,并针对工程应用给出了注意事项,如波速校准、采样率要求、噪声处理等。这使得该方法不仅具有学术价值,也具有很强的实际应用前景。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值