nslog

GCD-Grand Central Dispatch

社会主义新天地 提交于 2020-04-03 05:30:52
经常要用的,总结分类一下。    //获得队列 DISPATCH_QUEUE_PRIORTY 优先级 dispatch_queue_t Queue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT,0); dispatch_queue_t MainQueue = dispatch_get_main_queue(); //自定义Queue 第二参数默认串行(FIFO) DISPATCH_QUEUE_CONCURRENT(可选,并发) dispatch_queue_t SelfQueue = dispatch_queue_create("COM.M1989.Queue", NULL); //dispatch_async dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT,0), ^{ //Do Some? }); dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT,0), ^{ //耗时操作 dispatch_async(dispatch_get_main_queue(), ^{ //更新界面 }); }); //dispatch

iOS各种调试技巧豪华套餐

守給你的承諾、 提交于 2020-03-30 01:27:14
  在iOS开发过程中,调试是很重要的过程,而除了各种断点调试(普通断点、条件断点、全局断点)之外,似乎NSLog是我们调试最常用的方法,当然,也是最简单朴素的寻debug方法。   在项目中,我们常使用的NSLog的语句无外乎以下一种:    NSLog(@"打印字符串:%@",name); NSLog(@"打印整形:%i",number);//或者 %li ; %ld ; %d NSLog(@"打印字符:%c",c); NSLog(@"打印单浮点数:%f",f); NSLog(@"打印精度浮点数:%.2f",f); NSLog(@"BOOL--b-->%@",isYES?@"YES":@"NO");//打印布尔类型   但这样并不是我们想要的结果,因为打印出来的结果,有时我们并不知道它打印的具体位置,甚至于具体信息。打个比方吧,我们经常会遇到的数组越界、网络请求数据为空等等。   我们试一下看看:创建一个空数组-->dataArray,却打印数组的第三个元素。打印结果如下图:     从上图中我们可以看出,一个标准的数组越界,但我们看得出来,debug输出只是说又一个数组越界报错了,但并没有指出是哪个数组,数组在哪个位置。。。试想:如果我们在一个ViewController中有几个数组,这时数组出现越界。就会很难找出到底哪个数组出现debug。那么问题就出现了

iOS获取手机当前的网络状态

蹲街弑〆低调 提交于 2020-03-29 07:11:21
获取iOS网络状态,目前有两个办法。 1.通过监听手机状态栏的信息。 2.通过使用官方提供的类Reachability。 一、通过手机监听手机状态栏的信息 好处: 1.可以通过苹果的审核上架AppStore。 2.代码量少,简单易懂。 3.可以区分网络类型,精确到2G,3G,4G。 缺点:必须保证在使用该方法的过程中,手机状态栏statusBar没有隐藏。 代码如下: - (NSString *)networkingStatesFromStatusBar { UIApplication *app = [UIApplication sharedApplication]; NSArray *children = [[[app valueForKeyPath:@"statusBar"] valueForKeyPath:@"foregroundView"] subviews]; int type = 0; for (id child in children) { if ([child isKindOfClass:[NSClassFromString(@"UIStatusBarDataNetworkItemView") class]]) { type = [[child valueForKeyPath:@"dataNetworkType"] intValue]; } } NSString

iOS 指纹识别常见问题汇总

末鹿安然 提交于 2020-03-29 05:23:15
作者 年小羊 关注 转发: http://www.jianshu.com/p/d44b7d85e0a6 最近公司的 app 要使用指纹支付了;总体来说还是蛮顺利的;但是中间有遇到一些坑;下面就对坑进行汇总; 一.基本知识 点开这个 LocalAuthentication.framework ,发现里面主要有这么几个东西 LocalAuthentication.framework - LAContext.h - LAError.h - LAPublicDefines.h - LocalAuthentication.h LocalAuthentication.h 这个没什么可讲的吧,代码就两行,一行导入 LAContext.h ,一行导入 LAError.h ,这个 LocalAuthentication 类是暴露出来方便开发者调用的类。 LAPublicDefines.h 先从简单的开始讲吧,首先是 LAPublicDefines.h ,从名字上来看是公共宏定义类,里面包含了许多定义好的宏,这些宏会在 LAContext.h 得到使用。 // // LAPublicDefines.h // LocalAuthentication // // Copyright (c) 2014 Apple. All rights reserved. // #ifndef

NSLog的各种打印格式符和打印CGRect相关结构体

喜你入骨 提交于 2020-03-23 12:04:37
1、打印CG开头的数据类型,如CGRect,CGSize等方法 1.1 打印CGRect : NSLog(@"%@", NSStringFromCGRect(someCGRect)); 1.2 打印 CGSize : NSLog(@"%@",NSStringFromCGSize(someCG Size )); 1.3 其他的是: NSStringFromCGPoint、NSStringFromCGAffineTransform、NSStringFromUIEdgeInsets 2、NSLog的输出格式符如下所示: 符号 说明 符号 说明 %@ 对象 %d, %i 整数 %hi 短整型 %lli 长整型 %u 无符整形 %f 浮点/双字 %0.2f 精度浮点数,且只保留两位小数 %x, %X 二进制整数 %o 八进制整数 %zu size_t %p 指针 %e 浮点/双字 (科学计算) %g 浮点/双字 科学技术法(用最简短的方式) %s C (char*)字符串 %.*s Pascal字符串 %c 字符 %C unichar %lld 64位长整数(long long) %llu 无符64位长整数 %Lf 64位双字 %lu sizeof(i)内存中所占字节数 来源: https://www.cnblogs.com/CH520/p/11182414.html

oc82--成员变量使用copy修饰

余生颓废 提交于 2020-03-22 19:22:40
// // Person.h #import <Foundation/Foundation.h> typedef void (^myBlock)(); @interface Person : NSObject //@property (nonatomic, retain) NSString *name; @property (nonatomic, copy) NSString *name; // 注意: 如果是block使用copy并不是拷贝, 将pBlock所指向的代码块从栈转移到堆中。block在堆中,使用外界对象的时候,会对外界对象的计数器加1, @property (nonatomic, copy) myBlock pBlock; //@property (nonatomic, retain) myBlock pBlock; @end // // Person.m #import "Person.h" @implementation Person - (void)dealloc { // 由于block使用外界对象会对里面的对象加1,因此要在Person释放的时候把里面使用的对象也释放。 // 只要给block发送一条release消息, block中使用到的对象d也会收到该消息。 Block_release(_pBlock); NSLog(@"%s", __func__)

OC中的特有语法

泪湿孤枕 提交于 2020-03-22 18:32:55
一、 分类 -Category 1. 基本用途 如何在不改变原来类模型的前提下,给类扩充一些方法?有 2 种方式 l 继承 l 分类( Category ) 2. 格式 分类的声明 @interface 类名 (分类名称) // 方法声明 @end 分类的实现 @implementation 类名 (分类名称) // 方法实现 @end 3. 好处 一个庞大的类可以分模块开发 一个庞大的类可以由多个人来编写,更有利于团队合作 给 NSString 增加一个类方法:计算某个字符串中阿拉伯数字的个数 给 NSString 增加一个对象方法:计算当前字符串中阿拉伯数字的个数 4. 给系统自带的类添加分类 5. 注意 Category可以访问原始类的实例变量,但不能添加变量,只能添加方法。如果想添加变量,可以考虑通过继承创建子类 Category可以实现原始类的方法,但不推荐这么做,因为它是直接替换掉原来的方法,这么做的后果是再也不能访问原来的方法 多个 Category 中如果实现了相同的方法,只有最后一个参与编译的才会有效 二、 类的本质 1. 类也是个对象 其实类也是一个对象,是 Class 类型的对象,简称“类对象” Class 类型的定义 typedef struct objc_class *Class; 类名就代表着类对象,每个类只有一个类对象 2. +load 和 +

Xcode断点调试技巧

霸气de小男生 提交于 2020-03-16 11:46:14
本文转载自 破船 在程序中,无论是你想弄清楚为什么数组中有3个对象而不是5个,或者为什么一个新的玩家开始之后,游戏在倒退——调试在这些处理过程中是比较重要的一部分。通过本文的学习,我们将知道在程序中,可以使用的大多数重要调试功能,并如何利用这些调试功能来帮助你以更少的时间解决bug。 本文将介绍如下内容: 使用控制台检查程序的状态 进行日志记录,并熟练的驾驭NSLog 利用对象的生命周期跟踪内存的使用 使用控制台进行检查 在进行调试程序的时候,可能Xcode底部的小黑框会是你最好的朋友。它能输出日志信息,错误信息以及其它各种有用的内容——这可以帮助你进行错误的跟踪。除了可以在看到日志的输出,我们还可以在某个断点出停留住,并检查程序中的变量信息。 带条件的断点 本文假设你以及知道断点是如何工作的了(即使不知道的话,也不用担心,看完本文之后,你将明白!)。 在某个特定的时间点命中断点是非常重要的,在有些断点中,有些时候需要通过一个痛苦的循环或者递归函数才能让我们的对象等于某个确定的值。此时我们可以使用条件断点! 条件断点是这样的一类断点:只有当满足某个确定的条件时,才会命中断点。可以想象一下:我们只希望当对象在某个确定的状态,或者循环迭代到第nth次时才命中断点。单击Xcode editor中的‘gutter’可以添加一个断点,在断点上单击右键,然后选择‘edit breakpoint

iOS监听电话来电、挂断、拨号等

≡放荡痞女 提交于 2020-03-13 04:25:33
以下,来讲解在app内如何调用打电话功能和监听电话来电、挂断、拨号等功能。 简单的UI布局: 首先,先实现拨打电话的功能,以便于后续测试: // 拨打电话 - (IBAction)dialingButtonClick:(UIButton *)sender { NSURL *url = [NSURL URLWithString:@"tel:138xxxxxxxx"];// 填入有效电话号码 NSURLRequest *request = [NSURLRequest requestWithURL:url]; UIWebView * callWebview = [[UIWebView alloc] init]; [callWebview loadRequest:request]; [self.view addSubview:callWebview]; } 然后,监听电话,首先需要我们导入一个框架并引入头文件: // 导入框架 CoreTelephony.framework #import <CoreTelephony/CTCallCenter.h> #import <CoreTelephony/CTCall.h> 监测电话: // 监测电话 - (void)monitorCall { self.callCenter.callEventHandler = ^(CTCall* call) {

iOS:OC与JS交互

廉价感情. 提交于 2020-03-12 08:09:04
目的是为了在webView页面截取到js操作,然后跳出到本地进行处理 第一种方法:使用原生的处理方式 1.下边是本地的 a.html 的源代码 <!DOCTYPE html> <html lang="en"> <head> <meta charset="utf-8"/> <meta http-equiv="X-UA-Compatible" content="IE=edge"/> <meta name="viewport" content="width=device-width, initial-scale=1.0, minimum-scale=1.0, maximum-scale=1.0, user-scalable=no"/> <script> function test() { alert('clicked'); } function testParams(a, b){ alert(a+b); } </script> </head> <body> <button onclick="test()">点击我</button> <button onclick="testParams('hello', 123)">点击我(带参数)</button> </body> </html> 2.导入JavaScriptCore.framework,在需要调用的web页面加上头文件#import