CG_INLINE void
GCDDelay(int64_t delayInSeconds,dispatch_block_t block){
dispatch_time_t popTime = dispatch_time(DISPATCH_TIME_NOW, delayInSeconds * NSEC_PER_SEC);
dispatch_after(popTime, dispatch_get_main_queue(),block);
} CG_INLINE void
GCDOnce( dispatch_once_t onceToken,DISPATCH_NOESCAPE dispatch_block_t block){
dispatch_once ( &onceToken, block);
} CG_INLINE CGFloat
WIDTH(){
static CGFloat ScreenWidth;
static dispatch_once_t onceToken;
GCDOnce(onceToken,^{
ScreenWidth = CGRectGetWidth([UIScreen mainScreen].bounds);
});
return ScreenWidth;
}; CG_INLINE CGFloat
HEIGHT(){
static CGFloat ScreenHeight;
static dispatch_once_t onceToken; GCDOnce(onceToken,^{
ScreenHeight = CGRectGetHeight([UIScreen mainScreen].bounds);
});
return ScreenHeight;
}; CG_INLINE CGRect
SCREEN(){
static CGRect ScreenRect;
static dispatch_once_t onceToken; GCDOnce(onceToken,^{
if (CGRectIsEmpty(ScreenRect) || CGRectIsNull(ScreenRect)) {
ScreenRect = [UIScreen mainScreen].bounds;
}
});
return ScreenRect;
}; CG_INLINE CGFloat
FontScale(){
static CGFloat FScale;
static dispatch_once_t onceToken; GCDOnce(onceToken,^{
FScale = 72.0/96.0;
});
return FScale;
}; CG_INLINE CGFloat
SizeScaleX(){
static CGFloat autoSizeScaleX;
static dispatch_once_t onceToken; GCDOnce(onceToken,^{
autoSizeScaleX = (WIDTH()>480?WIDTH()/320.0:1.0);
});
return autoSizeScaleX;
}; CG_INLINE CGFloat
SizeScaleY(){
static CGFloat autoSizeScaleY;
static dispatch_once_t onceToken; GCDOnce(onceToken,^{
autoSizeScaleY = (WIDTH()>480?HEIGHT()/568.0:1.0);
});
return autoSizeScaleY;
}; CG_INLINE CGRect
CGLFLMake(CGFloat x, CGFloat y, CGFloat width, CGFloat height)
{
CGRect rect;
rect.origin.x = x *SizeScaleX();
rect.origin.y = y *SizeScaleY();
rect.size.width = width *SizeScaleX();
rect.size.height = height *SizeScaleY();
return rect;
}; CG_INLINE CGPoint
CGPointLFLMake(CGFloat x, CGFloat y)
{
CGPoint pointLFL;
pointLFL.x = x * SizeScaleX();
pointLFL.y = y * SizeScaleY();
return pointLFL;
}; CG_INLINE CGSize
CGSizeLFLMake(CGFloat width, CGFloat height)
{
CGSize sizeLFL;
sizeLFL.width = width* SizeScaleX();
sizeLFL.height = height* SizeScaleY();
return sizeLFL;
};

OC使用inline替代宏的更多相关文章

  1. c++内联函数解析(inline)

    一.基本定义 inline是C++语言中的一个关键字,可以用于程序中定义内联函数,inline的引进使内联函数的定义更加简单.说到内联函数,这里给出比较常见的定义,内联函数是C++中的一种特殊函数,它 ...

  2. R语言高性能编程,优化(一)

    这段时间学习了<R高性能编程>这本书,基于这段时间做的项目实践,总结了一些自己的体会,和大家分享 一.为什么R程序有时候会很慢?1.计算性能的三个限制条件 cpu ram io R代码本身 ...

  3. C++笔试

    个人整理,借鉴网络 1.C和C++中struct的区别 1).C的struct无protect和private属性,C++的有 2).C不能定义函数,C++能 3).C中struct加了typedef ...

  4. 高效完成R代码

    为什么R有时候运行慢? 参考https://www.cnblogs.com/qiaoyihang/p/7779144.html 一.为什么R程序有时候会很慢? 1.计算性能的三个限制条件 cpu ra ...

  5. iOS OC内联函数 inline的详解

    inline 在iOS中的一些框架中,static inline是经常出现的关键字组合. static自不用多说,表示在当前文件中应用,如 static A, 在其它文件中也可以出现static A. ...

  6. inline用于替代宏函数

    在C&C++中 一.inline关键字用来定义一个类的内联函数,引入它的主要原因是用它替代C中表达式形式的宏定义. 表达式形式的宏定义一例: #define ExpressionName(Va ...

  7. OC 面试问题汇总

    OC 问题汇总: 1. 你如何理解 iOS 内存管理   1. new alloc copy retain这些对象我们都要主动的release或者 autorelease   2. 如果是类方法创建的 ...

  8. const与#define宏常量 , inline与#define

    1.预处理 预处理器是在真正的编译开始之前由编译器调用的独立程序.预处理器可以删除注释.包含其他文件以及执行宏替代. 预处理命令(宏定义#define..#undef. 文件包含#include. 条 ...

  9. OC中修饰符:宏define 常量:const extern

    const const最好理解,修饰的东西不能被修改 指针类型根据位置的不同可以理解成3种情况: I 常量指针 // 初始化之后不能赋值,指向的对象可以是任意对象,对象可变. NSString * c ...

随机推荐

  1. POJ-3669 Meteor Shower(bfs)

    http://poj.org/problem?id=3669 注意理解题意:有m颗行星将会落在方格中(第一象限),第i颗行星在ti时间会摧毁(xi,yi)这个点和四周相邻的点,一个人开始在原点,然后只 ...

  2. 利用正则表达式去掉html代码

    using System.Text.RegularExpressions; // 利用正则表达式去掉"<"和">"之间的内容. private st ...

  3. serialize-and-deserialize-bst

    https://leetcode.com/problems/serialize-and-deserialize-bst/ 1. 用到Java Queue接口, // LinkedList实现了Queu ...

  4. Android实现ExpandableTextView可扩展TextView

    介绍 在应用开发中,总会遇到一些类似于公告,说明等长文本的TextView,但是为了排版美观等因素,我们通常是要隐藏后半部的文本,只显示部分文字,然后在尾部会提供用户一个扩展/收缩的按钮,使得文本框可 ...

  5. core--线程同步(用户模式)

    用户模式下的多线程同步只适用用于同一个进程内的多个线程,其范围使用于读写问题:比如一本书,必须是作者A写完之后,读者B才能够读取.否则作者一边修改,读者一边读,完全乱套. 线程读者B如何能在多线程环境 ...

  6. C语言之移位操作

    C语言很多操作都是以字节为单位进行的,但有时为了节约空间,很多系统程序中要求在比特位级别进行运算处理.C语言一同提供了六种位运算的运算符,分别为&(按位与),|(按位或),~(按位取反),^( ...

  7. typedef函数指针用法

    typedef void(*vp)(); 将vp声明为一个函数指针类型,该类型的指可以针指向一个没有参数,带空返回值的函数. 调用方法vp p;创建一个vp类型的函数指针p void print(vp ...

  8. erl_0013 erlang 带参数模块 parameterized modules are no longer supported

    code: -module(mod_test, [Name]). -export([show/0]). show() -> io:format("show:~p~n",[Na ...

  9. Spark源码阅读(1): Stage划分

    Spark中job由action动作生成,那么stage是如何划分的呢?一般的解答是根据宽窄依赖划分.那么我们深入源码看看吧 一个action 例如count,会在多次runJob中传递,最终会到一个 ...

  10. (七)7.2 应用机器学习方法的技巧,准确率,召回率与 F值

    建立模型 当使用机器学习的方法来解决问题时,比如垃圾邮件分类等,一般的步骤是这样的: 1)从一个简单的算法入手这样可以很快的实现这个算法,并且可以在交叉验证集上进行测试: 2)画学习曲线以决定是否更多 ...