nslog

再见了NSLog

半城伤御伤魂 提交于 2020-02-15 05:44:39
本文原文发表自我的【 自建博客 】,cnblogs同步发表,格式未经调整,内容以原博客为准 我是前言 打Log是我们debug时最简单朴素的方法, NSLog 对于objc开发就像 printf 对于c一样重要。但在使用 NSLog 打印大量Log,尤其是在游戏开发时(如每一帧都打印数据), NSLog 会明显的拖慢程序的运行速度(游戏帧速严重下滑)。本文探究了一下 NSLog 如此之慢的原因,尝试使用lldb断点调试器解决DebugLog问题。 小测试 测试下分别使用 NSLog 和 printf 打印10000次耗费的时间。 CFAbsoluteTimeGetCurrent() 函数可以打印出当前的时间戳,精度还是很高的,于是乎测试代码如下: 1 2 3 4 5 6 7 8 9 10 11 12 13 CFAbsoluteTime startNSLog = CFAbsoluteTimeGetCurrent(); for (int i = 0; i < 10000; i++) { NSLog(@"%d", i); } CFAbsoluteTime endNSLog = CFAbsoluteTimeGetCurrent(); CFAbsoluteTime startPrintf = CFAbsoluteTimeGetCurrent(); for (int i = 0; i <

NSLog is unavailable

邮差的信 提交于 2020-02-14 01:37:52
问题 I have following function: func myNSLog(_ givenFormat: String, _ args: CVarArg..., _ function:String = #function) { let format = "\(function): \(givenFormat)" NSLog(format, args) Wich result in the following error: 'NSLog' has been explicitly marked unavailable here (Foundation.NSLog) Within the documentation is it explicit listed as available. What do I miss? 回答1: Similar as in C, you cannot pass a variable argument list directly to another function. You have to create a CVaListPointer (the

NSLog is unavailable

六月ゝ 毕业季﹏ 提交于 2020-02-14 01:37:41
问题 I have following function: func myNSLog(_ givenFormat: String, _ args: CVarArg..., _ function:String = #function) { let format = "\(function): \(givenFormat)" NSLog(format, args) Wich result in the following error: 'NSLog' has been explicitly marked unavailable here (Foundation.NSLog) Within the documentation is it explicit listed as available. What do I miss? 回答1: Similar as in C, you cannot pass a variable argument list directly to another function. You have to create a CVaListPointer (the

Xcode 项目文件介绍

99封情书 提交于 2020-02-13 08:05:59
一、项目文件结构示意图 二、文件介绍 1.products文件夹:主要用于mac电脑开发的可执行文件,ios开发用不到这个文件 2.frameworks文件夹主要用来放依赖的框架 3.test文件夹是用来做单元测试的 4.常用的文件夹(项目名称文件夹) (1)XXXinfo.plist文件(在该项目中为 01-常见文件-Info.plist) 1)简单说明 是配置文件,该文件对工程做一些运行期的配置,非常重要,不能删除。 在旧版本xcode创建的工程中,这个配置文件的名字就叫做info.plist。 注意:因此在载入自己准备的plist文件的时候,不要以info命名。 2)配置文件的属性介绍: bundle display name: 应用程序显示名称。如果要修改桌面上显示的文件名称,只要修改此处就可以了。(需要先删除原始的程序,然后清空一下工程,因为程序有缓存) bundle identifer: 唯一标识符(唯一的标识着一个应用程序,为了保证程序的唯一性,通常把域名倒过来写) Bundle versions string, short和bundle versions : 两个都用来表示应用程序的版本,前面的版本是正式的版本,后面的为内部版本,即公司内部开发的版本。要求提示:上传app的时候,后面更新的版本必须比之前的版本大。 main storyboard file base

iOS 多线程相关 线程组

别说谁变了你拦得住时间么 提交于 2020-02-06 16:58:25
- (void)touchesBegan:(NSSet<UITouch *> *)touches withEvent:(UIEvent *)event{ dispatch_queue_t queue = dispatch_get_global_queue(0, 0); dispatch_async(queue, ^{ NSLog(@"1"); //这句话的本质是往runloop中添加定时器 [self performSelector:@selector(test) withObject:nil afterDelay:.0]; NSLog(@"3"); //若不启动runloop 子线程中是不会执行定时器的 打印结果为 1 3 执行了 打印结果为 1 3 2 [[NSRunLoop currentRunLoop] runMode:NSDefaultRunLoopMode beforeDate:[NSDate distantFuture]]; }); } -(void)test{ NSLog(@"2"); } - (void)touchesBegan:(NSSet<UITouch *> *)touches withEvent:(UIEvent *)event{ NSThread *thred = [[NSThread alloc]initWithBlock:^{ NSLog(@"1")

iOS 检测网络状态

给你一囗甜甜゛ 提交于 2020-02-04 19:18:41
一般有两种方式,都是第三方的框架,轮子嘛,能用就先用着,后面再优化。 一:Reachability 1.首先在AppDelegate.h添加 头文件"Reachability.h",导入框架SystemConfiguration.frame。 2. 在AppDelegate.m中这样实现: 1 - (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions{ 2 //开启网络状况的监听 3 //来订阅实时的网络状态变化通知。导入Reachability.h头文件,然后注册一个对象来订阅网络状态变化的信息,网络状态变化的信息名称为kReachabilityChanged-Notification 4 5 [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(reachabilityChanged:) name:kReachabilityChangedNotification object:nil]; 6 //通过检查某个主机能否访问来判断当前网络是否可用: 7 self.hostReach = [Reachability

AJ整理问题之:内存堆栈

谁说胖子不能爱 提交于 2020-02-04 05:47:49
内存 数据在内存中的存放 在计算机中,运行的应用程序的数据都是保存在内存中的。 不同类型的数据,保存的内存区域不同,其中包括: 1:栈区(stack)由编译器自动分配并释放,一半存放函数的参数值,局部变量等。 2:堆区(heap)由程序员分配和释放,如果程序员不释放,程序结束时,可能会由操作系统回收。 3:全局区(静态区)全局变量和静态变量的存储是放在一起的,初始化的全局变量和静态变量存放在一块区域,未初始化的全局变量和静态变量在相邻的另一块区域,程序结束后由系统释放。 上面三个很重要,下面三个了解 4:文字常量区:存放常亮字符串,程序结束后由系统释放。 5:程序代码区:存放函数的二进制代码。 6:寄存器去:用来保存栈顶指针和指令指针(我们基本用不到。。。)。 栈内存区中得数据 栈区内存是压栈的讲究 特点:先进后出。 系统给自动回收。 由系统自动分配,速度较快。但程序员是无法控制的。 int sum(int x, int y) { NSLog(@"x: %p, Y: %p", &x, &y); int result = x + y; NSLog(@"%p", &result); return result; } void demo1() { // 在栈区中的变量,i本质上对应"内存地址"的"标签" // 指针 * 表示指向内容空间的内容 & 表示地址 int i = 10; i =

iOS_多线程三:NSOperation

 ̄綄美尐妖づ 提交于 2020-01-24 08:03:48
NSOperation 是一个抽象类,线程安全,不需要添加额外的锁 使用其子类:NSInvocationOperation 和 NSBlockOperation 1、NSInvocationOperation 一个对象,表示一个任务 默认在主线程中同步顺序执行,想要并发异步,需要搭配`NSOperationQueue`使用 同步/异步,通过设置最大并发数`maxConcurrentOperationCount`实现:1:同步 >=2:异步 默认:-1 异步(无穷大) 2、NSBlockOperation 一个对象,可以创建多个任务 blockOperationWithBlock 添加的任务默认在主线程中 addExecutionBlock 添加任务,会开启多个线程,并发执行 一、NSInvocationOperation 一个 NSInvocationOperation 对象表示一个任务,需要手动调用 start 开启。 NSInvocationOperation *operation = [[NSInvocationOperation alloc] initWithTarget:self selector:@selector(network:) object:@{@"name":@"moxiaohui"}]; [operation setName:@"moxiaoyan"];

Customise NSLog so it shows less info

杀马特。学长 韩版系。学妹 提交于 2020-01-23 17:51:47
问题 by default NSLog outputs a long string before the requested output, e.g: NSLog(@"Log message"); Outputs to the console: 2011-04-15 11:23:01.692 MyAppName[23160:903] Log message I know I can add the filename and line number to the log, but how do I get rid of all the date, time and app name that appears before the message? I find it really clutters the console in Xcode making it harder to find the information I'm after. 回答1: This is definitely the FIRST thing I do on a new project. NSLog(…)

Block使用的简单总结

南笙酒味 提交于 2020-01-21 22:16:42
【Block的简单使用】    1. block 当作参数来传递   如下定义一个没有返回值无参数的 block ,并把它作为参数,让系统调用,注意:这里是系统在调用,因为 UIView 动画结束是系统调用的。 void(^myBlock)(void) = ^() { NSLog(@"定义了一个 Block"); }; [UIView animateWithDuration:0.3 animations:myBlock];   那么为什么需要把 block 当作参数去使用呢?   这就引出了 block 这个时候的使用场景:当自己封装一个类的时候,有些事情由外部决定,但什么时候做由内部决定,(即内部决定执行时间,外部传入具体做些什么)——这个时候就可以使用 block 来作为参数。    2. block 当作返回值来使用    如下在控制器写下面代码, test 为方法名, void (^)( void ) 就是 block 的类型,它就是方法的返回值类型。 - (void(^)(void))test { return ^{ NSLog(@"test"); }; }   那么上面这个方法该如何调用呢?   第一种常规方式: [self test](); ,因为 test 是一个方法,所以 [self test] 调用方法后得到的是一个 block,而执行 block