• iOS开发中使用宏定义提高开发效率


    iOS开发中使用宏定义提高开发效率

      (2013-07-10 10:47:33)
     

    iOS开发中,巧妙的使用宏定义,可以提高开发效率,本篇简单介绍一下宏的定义,设置,应用,并在未来实践中不断追加一些常用的宏定义。

    调试Log

    iPhone应用程序开发调试的时候,在代码中加入NSLog的暴力调试方法是很频繁的,但是在release的时候要删除这些调试代码,那工作量是烦躁,这样的情况下,试用宏就会显得非常的方便。 看下面的例子:

    #ifdef DEBUG
     #define LOG(...) NSLog(__VA_ARGS__);
     #define LOG_METHOD NSLog(@"%s", __func__);
    #else
     #define LOG(...);
     #define LOG_METHOD;
    #endif
    

    像上面例子这些宏,ProjectName_Prefix.pch中追加之后,不用import就能直接在工程的文件中直接试用了。默认情况下,在工程设置的Macros里已经有DEBUG的设置参数的,如果需要添加其他参数的话,就在Xcode的工程设定里设置相对应的参数:

    1. 1.打开工程设置
    2. 2.「TARGETS」下选择设置对应工程「Build Setting」
    3. 3.「XXX – Preprocessing」选项下的「Preprocessor Macros」项目的「DEBUG」中追加对应的参数

    这样设置以后,调试log的代码段只会在debug的时候才有效。 另外使用方法的话,就是用定义的LOG方法去替代NSLog方法,想打出函数名的log就使用LOG_METHOD。 例:

    LOG(@"Data:%@",str);
    LOG_METHOD
    

    大家可以根据项目的需要添加各种log处理的形式,这样就方便许多了。

    #ifdef DEBUG
     #define DNSLogPoint(p) NSLog(@"%f,%f", p.x, p.y);
     #define DNSLogSize(p) NSLog(@"%f,%f", p.width, p.height);
     #define DNSLogRect(p) NSLog(@"%f,%f,%f,%f", p.origin.x, p.origin.y, p.size.width, p.size.height,);
    #else
     #define DNSLogPoint(p);
     #define DNSLogSize(p);
     #define DNSLogRect(p);
    

    其他应用

    除了DEBUG,有时候有很多的配置用宏的话,写代码也没有那么烦躁,比如说Google Analytics的设定

    #define GA_TRACKPAGE(PAGE) { NSError *error; if (![[GANTracker sharedTracker]trackPageview:[NSString stringWithFormat:@"/%@", PAGE] withError:&error]) { LOG(@"%@",error.helpAnchor); } LOG(@"GA /%@", PAGE); };
    #define GA_TRACKEVENT(EVENT,ACTION,LABEL,VALUE) { NSError *error; if (![[GANTracker sharedTracker] trackEvent:EVENT action:ACTION label:LABEL value:VALUE withError:&error]){ LOG(@"%@",error.helpAnchor); } LOG(@"GA %@/%@/%@", EVENT, ACTION, LABEL); };
    #define GA_TRACK_CLASS GA_TRACKPAGE(NSStringFromClass([self class]));
    #define GA_TRACK_METHOD GA_TRACKEVENT(NSStringFromClass([self class]),NSStringFromSelector(_cmd), @””, -1); }
    

    多行表示的写法

     
    #define ReloadBarButton [[[UIBarButtonItem alloc] initWithImage:ReloadBarButtonIcon     style:UIBarButtonItemStylePlain
     target:self action:@selector(ContentsReload:)]
    autorelease]
     
     
    参照C语言的预处理命令简介 :
    #define              定义一个预处理宏
    #undef               取消宏的定义
    #include            包含文件命令
    #include_next   与#include相似, 但它有着特殊的用途
    #if                      编译预处理中的条件命令, 相当于C语法中的if语句
    #ifdef                判断某个宏是否被定义, 若已定义, 执行随后的语句
    #ifndef             与#ifdef相反, 判断某个宏是否未被定义
    #elif                  若#if, #ifdef, #ifndef或前面的#elif条件不满足, 则执行#elif之后的语句, 相当于C语法中的else-if
    #else                与#if, #ifdef, #ifndef对应, 若这些条件不满足, 则执行#else之后的语句, 相当于C语法中的else
    #endif              #if, #ifdef, #ifndef这些条件命令的结束标志.
    defined            与#if, #elif配合使用, 判断某个宏是否被定义
    #line                标志该语句所在的行号
    #                      将宏参数替代为以参数值为内容的字符窜常量
    ##                   将两个相邻的标记(token)连接为一个单独的标记
    #pragma        说明编译器信息#warning       显示编译警告信息
    #error            显示编译错误信息

    #define SAFE_RELEASE(obj) if(obj){[obj release];obj=nil;} 释放

    参考文档:
    http://blog.csdn.net/wangqiuyun/article/details/8104698
     
    http://blog.csdn.net/a351945755/article/details/8433909
    D大调
     
     
    =====================================
     

    iOS开发中使用宏定义提高开发效率

    IOS 程序员开发最常用宏定义

     

    网上对IOS的宏定义比较多,我总结了一些最常用的宏,后续还会继续补上。

     

    1.首次启动判断:

     

    #define First_Launched @"firstLaunch"

    2.ios7系统判断:

     

    #define IsIOS7 ([[[UIDevice currentDevice] systemVersion] floatValue] >=7.0 ? YES : NO)

    3.判断是否Retina屏、是否IPhone5、是否IPad

    #define isRetina ([UIScreen instancesRespondToSelector:

    @selector(currentMode)] ? CGSizeEqualToSize(CGSizeMake(640, 960), 

    [[UIScreen mainScreen] currentMode].size) : NO)

     

    #define iPhone5 ([UIScreen instancesRespondToSelector:

    @selector(currentMode)] ? CGSizeEqualToSize(CGSizeMake(640, 1136), 

    [[UIScreen mainScreen] currentMode].size) : NO)

    #define isPad (UI_USER_INTERFACE_IDIOM() == UIUserInterfaceIdiomPad)

     

     

    4.加载图片宏:

     

    #define LOADIMAGE(file,type) [UIImage imageWithContentsOfFile:[[NSBundle mainBundle]pathForResource:file ofType:type]]

     

    5.rgb颜色转换(16进制->10进制)

    #define UIColorFromRGB(rgbValue) [UIColor colorWithRed:((float)((rgbValue & 0xFF0000) >> 16))/255.0 green:((float)((rgbValue & 0xFF00) >> 8))/255.0 blue:((float)(rgbValue & 0xFF))/255.0 alpha:1.0] 

    6.设置颜色RGB

    #define COLOR(R, G, B, A) 

    [UIColor colorWithRed:R/255.0 green:G/255.0 blue:B/255.0 alpha:A] 

     

    7.去除"-(id)performSelector:(SEL)aSelector withObject:(id)object;"的警告

    #define SuppressPerformSelectorLeakWarning(Stuff)

    do {

    _Pragma("clang diagnostic push")

    _Pragma("clang diagnostic ignored "-Warc-performSelector-leaks"")

    Stuff;

    _Pragma("clang diagnostic pop")

    } while (0)

     
    =====================================
     

    iOS常用宏定义

    速食冰块 速食冰块 2015-03-04 11:20:13

     ==========================

  • 相关阅读:
    getWritableDatabase()与getReadableDatabase()方法
    使用drawBitmapMesh扭曲图像
    移动游戏背景
    使用Matrix控制图片和组件的变化
    使用Matrix控制图像或组件变换的步骤
    1105: 零起点学算法12——求2个日期之间的天数
    1104: 零起点学算法11——求梯形面积
    1103: 零起点学算法10——求圆柱体的表面积
    1102: 零起点学算法09——继续练习简单的输入和计算(a-b)
    1101: 零起点学算法08——简单的输入和计算(a+b)
  • 原文地址:https://www.cnblogs.com/dexjay/p/4905572.html
Copyright © 2020-2023  润新知