当前位置: 首页 > news >正文

字画价格网站建设方案闵行网站制作哪里有

字画价格网站建设方案,闵行网站制作哪里有,新乡网络公司推荐,小程序怎么找出来作者 | mao2020来源 | 掘金#xff0c;点击阅读原文查看作者更多文章前言在我初学iOS的时候#xff0c;经常需要NSLog打印用于调试#xff0c;有时候还需要打印多个变量#xff1a;NSLog(xxxx frame% tag%ld isHidden%d, NSStringFromCGRect(view.frame), view… 作者 | mao2020来源 | 掘金点击阅读原文查看作者更多文章前言在我初学iOS的时候经常需要NSLog打印用于调试有时候还需要打印多个变量NSLog(xxxx frame% tag%ld isHidden%d, NSStringFromCGRect(view.frame), view.tag, view.isHidden);仅考虑把NSLog用来调试输出那写种代码就太麻烦了主要存在着这样几个问题需要格式化如%%ld%d需要设置标签以便知道输出值对应的变量如frametagisHidden需要类型转换如NSStringFromCGRect有时候还需要写一些指定字符串以便于在Console输出中搜索或过滤如xxxx后来接触到各种各样的Debug Log主要利用 __LINE__ 和 __func__ 可以很方便定位到输出的位置但是依然还存在前面3个问题。另外LLDB可以很方便获取变量值但在变量较多或需要连续打印的情况下也不够方便快捷。那个时候我就产生了一个想法能不能自己写一个Debug Log解决上面这些困扰我的问题这就是我开发HMLog的初衷源码仅有一个HMLog.h文件。基本用法项目源码及demohttps://github.com/chenhuimao/HMLog以下用法均可在HMLogDemo项目中找到。HMLogHMLog最终是基于NSLog输出根据前面的例子使用HMLog的代码和输出是这样的UIView *view [[UIView alloc] initWithFrame:CGRectMake(10, 20, 30, 40)];view.tag 333;HMLog(view.frame);HMLog(view.frame, view.tag, view.isHidden);// 输出如下// 2020-10-17 15:49:33.3568900800 HMLogDemo[85956:1573131] // -[ViewController viewDidLoad] [45] // 0: view.frame NSRect: {{10, 20}, {30, 40}}// 2020-10-17 15:49:33.3570170800 HMLogDemo[85956:1573131] // -[ViewController viewDidLoad] [46] // 0: view.frame NSRect: {{10, 20}, {30, 40}}// 1: view.tag 333// 2: view.isHidden NODemo中的一个例子用截图展示HMPrintHMPrint则基于printfUIView *view [[UIView alloc] initWithFrame:CGRectMake(10, 20, 30, 40)];view.tag 333;HMPrint(view.frame);HMPrint(view.frame, view.tag, view.isHidden);// 输出如下// -[ViewController viewDidLoad] [45] // 0: view.frame NSRect: {{10, 20}, {30, 40}}// // -[ViewController viewDidLoad] [46] // 0: view.frame NSRect: {{10, 20}, {30, 40}}// 1: view.tag 333// 2: view.isHidden NOHMFormatString如果只是需要自动格式化的目标字符串可以使用HMFormatStringself.displayLab.text HMFormatString(self.view.frame, self.view.tag, selector(viewDidLoad));printf(%s, self.displayLab.text.UTF8String);// -[ViewController getFormatString1] [80] // 0: self.view.frame NSRect: {{0, 0}, {414, 896}}// 1: self.view.tag 0// 2: selector(viewDidLoad) SEL: viewDidLoad可选参数所有可选参数都应该在#import HMLog.h之前定义好HMLogEnable / HMPrintEnable分别控制HMLog和HMPrint的是否生效默认生效不生效情况下调用没有任何效果。如只需要在Debug模式下开启HMPrint// Only enable HMPrint in Debug configuration#ifdef DEBUG#define HMPrintEnable 1#else#define HMPrintEnable 0#endif#import HMLog.hHMLogHeaderFormatString(FUNC, LINE)控制头部字符串(注意可以重用FUNC和LINE或者不使用)#define HMLogHeaderFormatString(FUNC, LINE) \ [NSString stringWithFormat:%s ????? %s:\n, FUNC, FUNC]#import HMLog.h...HMPrint(self.navigationItem.title);HMPrint(self.view.bounds.size, self.view.alignmentRectInsets, self.title, self.automaticallyAdjustsScrollViewInsets, self.navigationController, [self class], selector(viewDidAppear:));// 输出如下// -[ViewController print2] ????? -[ViewController print2]:// 0: self.navigationItem.title HMLogDemo// // -[ViewController print2] ????? -[ViewController print2]:// 0: self.view.bounds.size NSSize: {414, 896}// 1: self.view.alignmentRectInsets {0, 0, 0, 0}// 2: self.title (null)// 3: self.automaticallyAdjustsScrollViewInsets YES// 4: self.navigationController // 5: [self class] ViewController// 6: selector(viewDidAppear:) SEL: viewDidAppear:HMLogPrefix(index, valueString)控制每个变量输出的前缀。例如只需要展示下标则按下面的方式定义// Only show index prefix#define HMLogPrefix(index, valueString) [NSString stringWithFormat:%d: , index]#import HMLog.h...HMPrint(self.navigationItem.title);HMPrint(self.view.bounds.size, self.view.alignmentRectInsets, self.title, self.automaticallyAdjustsScrollViewInsets, self.navigationController, [self class], selector(viewDidAppear:));// -[ViewController print2] [79] // 0: HMLogDemo// // -[ViewController print2] [80] // 0: NSSize: {414, 896}// 1: {0, 0, 0, 0}// 2: (null)// 3: YES// 4: // 5: ViewController// 6: SEL: viewDidAppear:HMLogTypeExtension默认情况下不支持CGVector和CLLocationCoordinate2D类型可以额外匹配需要格式化的类型#define HMLogTypeExtension \else if (strcmp(type, encode(CGVector)) 0) { \CGVector actual (CGVector)va_arg(v, CGVector); \ obj NSStringFromCGVector(actual); \ } else if (strcmp(type, encode(CLLocationCoordinate2D)) 0) { \ CLLocationCoordinate2D actual (CLLocationCoordinate2D)va_arg(v, CLLocationCoordinate2D); \ obj [NSString stringWithFormat:latitude: %lf, longitude: %lf, actual.latitude, actual.longitude]; \ }#import #import HMLog.h...CGVector vector CGVectorMake(110, 119);CLLocationCoordinate2D coordinate CLLocationCoordinate2DMake(22.512145, 113.9155);HMPrint(vector, coordinate);// -[CustomizeFormatViewController log] [65] // 0: vector {110, 119}// 1: coordinate latitude: 22.512145, longitude: 113.915500使用注意项目需要Foundation和UIKit框架。C语言标准为gnu99Xcode项目的C Language Dialect选项设置为gnu99或gnu11HMLog项目的实现仅有一个文件HMLog.h可以在pch文件导入也可以在每个需要的文件分别导入。所有可选参数都应该在#import HMLog.h之前定义好一次调用最多支持20个变量没有支持所有的数据类型默认支持的类型参考源码可以使用HMLogTypeExtension进行扩展设计思路只考虑1个变量首先考虑1个变量的情况即HMLog只能传入1个变量。要格式化1个变量就要先知道这个变量的类型。变量可以通过__typeof__获取类型比如我们常常这样用__weak __typeof__(self) weakSelf self;。取得变量类型后还需要比较判断之后才能把id类型格式化为%把long类型格式化为%ld。类型如何做判断呢if(long id)显然是不行的OC类型编码encode会返回一个char *字符串这样就可以利用strcmp函数做比较了NSString *format;if (strcmp(encode(__typeof__(self.view)), encode(id)) 0) {format %;} else if (strcmp(encode(__typeof__(self.view)), encode(long)) 0) {format %ld;} else if ...参考苹果的文档也可以写成if (strcmp(encode(__typeof__(self.view)), ) 0)的形式。不过HMLog并没有采用这种简化的形式encode是编译器指令并不影响运行时效率上面的代码块中的形式更加直观。要把这个功能写成一个通用函数那如何表示任意的类型换句话说如果value是NSObject对象可以用id value表示但如果value可能是任何类型id该换成什么这个时候可变参数函数派上用场了可变参数最后的...是不需要写明数据类型的这样可以把变量(value)和变量的类型编码encode(__typeof__(value))同时传入进去同时利用宏把一个变量替换为这两种形式#define MyLog(value) _MyLog(__func__, __LINE__, encode(__typeof__(value)), (value))static void _MyLog(const char *func, int line, ...) {NSMutableString *result [[NSMutableString alloc] init]; [result appendFormat:\n %s [%d] \n, func, line]; va_list v; va_start(v, line);char *type va_arg(v, char *);if (strcmp(type, encode(id)) 0) { id actual (id)va_arg(v, id); [result appendFormat:id: %\n, actual]; } else if (strcmp(type, encode(long)) 0) { long actual (long)va_arg(v, long); [result appendFormat:long: %ld\n, actual]; } va_end(v);NSLog(%, result);}// 可以愉快地打印id和long类型了MyLog(self.view);MyLog(self.view.tag);把上面的例子的条件语句补充好需要的类型MyLog宏就可以打印任意类型的1个变量了。考虑多个变量接下来要考虑的是如何同时打印多个变量。按照前面的思路打印多个变量需要把每个变量(value)和变量的类型编码encode(__typeof__(value))都传给可变参数函数_MyLog另外还需要一个数量count表示一共有几组变量及其类型编码。为了实现这个需求这里使用了获取宏参数个数以及递归宏的技巧请阅读完这篇文章了解C语言宏定义使用总结与递归宏。最后补充好细节使变量名称化为字符串作为提示标签定制化使用的可选参数这就完成了HMLog。整体思路很清晰源码也只有一个200多行的HMLog.h文件难点基本上只有递归宏的使用。除此之外值得一提的还有两点float类型的值通过va_arg获取值先传入double类型然后再强制类型转换为float类型float actual (float)va_arg(v, double);这是因为有个规则叫默认参数提升还有一些char、short等类型也是如此。[result appendFormat:%%\n, ((void)(valueString), HMLogPrefix(i, valueString)), obj];这行代码为了消除宏HMLogPrefix(i, valueString)可能没有用到valueString导致的警告使用了逗号运算符这是宏定义使用中常用的一个运算符。参考资料[1]https://juejin.im/post/6884575803523203080[2]https://github.com/SnapKit/Masonry/blob/master/Masonry/MASUtilities.h
http://www.sadfv.cn/news/195253/

相关文章:

  • 婚庆网站开发的意义济南槐荫区做网站的
  • 在家建设一个网站需要什么材料湖南如何做网络营销
  • php自己做网站家里做服务器开网站
  • 网站助手 伪静态网站免费做软件有哪些
  • 租房网站深圳市外贸网站
  • h5购物网站模板免费注册163邮箱帐号
  • 15年做那些网站能致富中国风电商网站建设
  • 写作挣钱的网站公司简介模板word
  • 会所网站模板网站基础三要素
  • 沈阳网站建设 房小二网站建设的会计分录
  • 手机自助建站平台免费wordpress 提交插件
  • wordpress开启自定义字段青岛网站建设优化
  • 做网站的电话网站建设工具哪家好
  • 做图片推广的网站有哪些石家庄站内换乘示意图
  • 酒店专业培训网站建设百度登陆
  • 北京模板网站建站英文医疗网站建设
  • 网页网站开发项目设计湖南网站seo营销多少费用
  • 安康市城市建设局网站网站的首页怎么做
  • 做招投标应该了解的网站技术外包
  • 免费做网站推广引擎搜索器
  • 有名的淘宝客网站网页网站原型图占位符怎么做
  • 上传宝贝网站建设属于什么类目乐陵seo外包信德
  • 网站可以制作ios做住宿的有几个网站
  • 深圳龙华新区网站建设室内设计接单网站
  • 毕设代做网站大气宽屏网站模板
  • 加密的网站使用jmeter做压测c2c定义
  • 网站建设 微盘下载益阳营销网站建设
  • 做1688网站运营工资怎么样网站开发天津网站开发
  • 网站页头尺寸网站建设主持词
  • 网站logo是什么吉林刷关键词排名优化软件