<?xml version="1.0" encoding="utf-8" ?><rss version="2.0"><channel><title><![CDATA[phxiang的博客]]></title><description><![CDATA[]]></description><link>https://blog.youkuaiyun.com/phxiang</link><language>zh-cn</language><generator>https://blog.youkuaiyun.com/</generator><copyright><![CDATA[Copyright &copy; phxiang]]></copyright><item><title><![CDATA[gif转化命令]]></title><link>https://blog.youkuaiyun.com/phxiang/article/details/78586463</link><guid>https://blog.youkuaiyun.com/phxiang/article/details/78586463</guid><author>phxiang</author><pubDate>Mon, 20 Nov 2017 20:46:24 +0800</pubDate><description><![CDATA[gif转化命令 ffmpeg -ss 00:00:03 -t 5 -i video.mov -s 640X360 -r “15” gif.gif]]></description><category></category></item><item><title><![CDATA[YAML safe loading is not available. Please upgrade psych to a version that supports safe loading (>=]]></title><link>https://blog.youkuaiyun.com/phxiang/article/details/78380275</link><guid>https://blog.youkuaiyun.com/phxiang/article/details/78380275</guid><author>phxiang</author><pubDate>Sat, 28 Oct 2017 22:41:43 +0800</pubDate><description><![CDATA[YAML safe loading is not available. Please upgrade psych to a version that supports safe loading (>= 2.0).
ERROR:  SSL verification error at depth 1: unable to get local issuer certificate (20)
ERROR:]]></description><category></category></item><item><title><![CDATA[Unable to require openssl, install OpenSSL and rebuild ruby (preferred) or use non-HTTPS sources]]></title><link>https://blog.youkuaiyun.com/phxiang/article/details/78223000</link><guid>https://blog.youkuaiyun.com/phxiang/article/details/78223000</guid><author>phxiang</author><pubDate>Fri, 13 Oct 2017 10:29:32 +0800</pubDate><description><![CDATA[mac os x 由于手动安装rvm导致了命令行一直报错  Unable to require openssl, install OpenSSL and rebuild ruby (preferred) or use non-HTTPS sources 
经过不断尝试 使用如下方案解决rvm get stable 
brew update 
brew doctor 
brew install ope]]></description><category></category></item><item><title><![CDATA[GCD(二)]]></title><link>https://blog.youkuaiyun.com/phxiang/article/details/77990050</link><guid>https://blog.youkuaiyun.com/phxiang/article/details/77990050</guid><author>phxiang</author><pubDate>Fri, 15 Sep 2017 11:50:29 +0800</pubDate><description><![CDATA[在开发中，我们经常会碰到一类问题，A任务开始执行的前提是B任务执行完成了，针对这种，如果只是简简单单的一个任务接一个任务，可能使用block 嵌套也可以做到，但是如果是C任务开始执行需要等A、B两个异步任务完成，这个呢？这里就需要使用到一些GCD的高级用法。 
1、gcd的分组      //创建分组
    dispatch_group_t group = dispatch_group_creat]]></description><category></category></item><item><title><![CDATA[几种编程思想（链式编程、响应式编程、函数式编程）]]></title><link>https://blog.youkuaiyun.com/phxiang/article/details/77934406</link><guid>https://blog.youkuaiyun.com/phxiang/article/details/77934406</guid><author>phxiang</author><pubDate>Mon, 11 Sep 2017 16:13:53 +0800</pubDate><description><![CDATA[1、链式编程，主要通过点‘.’来连接不同的函数调用 
    iOS上实现链式编程比较好的框架就是Masonry，通过查看Masonry源码，我们发现，每一个函数返回类型都是一个Block变量，然后Block变量中返回的内容就是当前对象本身。这样来实现通过点调用，直接上实例，实现一个简单的计算器/**
 加法
 */
- (Calculator * (^)(CGFloat num))add {]]></description><category></category></item><item><title><![CDATA[GCD中任务与队列（一）]]></title><link>https://blog.youkuaiyun.com/phxiang/article/details/77772664</link><guid>https://blog.youkuaiyun.com/phxiang/article/details/77772664</guid><author>phxiang</author><pubDate>Fri, 01 Sep 2017 14:25:09 +0800</pubDate><description><![CDATA[首先，GCD是一套基于C的并发编程（其实并不能理解为多线程，因为这个并不是自己来控制线程），使用的时候，我们不需要管理线程的任何生命周期，系统会自动帮我们管理。首先在底层是有一个任务队列与线程池的概念，如果这个不懂，百度一下先。其次先理解以下几个概念。 
1、同步、异步 
    同步：表示在当前线程（注意：不一定就表示主线程）执行任务，不去线程池中拿线程 
    异步：表示不在当前线程执行任务，]]></description><category></category></item><item><title><![CDATA[Swift实现单例模式]]></title><link>https://blog.youkuaiyun.com/phxiang/article/details/72401055</link><guid>https://blog.youkuaiyun.com/phxiang/article/details/72401055</guid><author>phxiang</author><pubDate>Wed, 17 May 2017 16:04:48 +0800</pubDate><description><![CDATA[设计模式一直都是老生常谈的，自己最近学习Swift，就拿设计模式来练练手吧 
首先是单例模式一、为什么要使用单例模式？1、控制资源的使用，通过线程同步来控制资源的并发访问（我觉得这个对客户端来说，只是个理论而已） 
2、控制实例产生的数量，达到节约资源的目的 
3、作为通信的媒介使用，其实就是数据的共享，它可以在不建立直接关联的情况下，让多个不相关的线程之间实现通信 
iOS中比较经典的单例类有:U]]></description><category></category></item><item><title><![CDATA[Charles解析https的坑]]></title><link>https://blog.youkuaiyun.com/phxiang/article/details/70890546</link><guid>https://blog.youkuaiyun.com/phxiang/article/details/70890546</guid><author>phxiang</author><pubDate>Fri, 28 Apr 2017 11:11:32 +0800</pubDate><description><![CDATA[最近软件碰到一个非常奇葩的bug，就是软件DEBUG的时候没有任何问题，发布以后，一直存在点问题。so，怎么办？？想到了使用release版本抓包数据，查找问题。之前一直使用Charles，抓包https的没有问题，enable ssl的时候出现unknown消息，disable ssl的时候出现乱码，这不是要逼死我的节奏吗？直接google，弄了半天也没找到靠谱的消息。后来在一篇博文中找到了解决方]]></description><category></category></item><item><title><![CDATA[iOS中消息机制的处理]]></title><link>https://blog.youkuaiyun.com/phxiang/article/details/70339919</link><guid>https://blog.youkuaiyun.com/phxiang/article/details/70339919</guid><author>phxiang</author><pubDate>Fri, 21 Apr 2017 22:04:59 +0800</pubDate><description><![CDATA[上一篇文章说道了消息的转发，*说到了调用一个类的方法时，先在本类中的方法缓存列表中进行查询，如果在缓存列表中找到了该方法的实现，就执行，如果找不到就在本类中的方列表中进行查找。在本类方列表中查找到相应的方法实现后就进行调用，如果没找到，就去父类中进行查找。如果在父类中的方法列表中找到了相应方法的实现，那么就执行，否则就执行下方的几步。*当调用一个方法在缓存列表，本类中的方法列表以及父类的方法列表找不]]></description><category></category></item><item><title><![CDATA[iOS中RunTime的应用]]></title><link>https://blog.youkuaiyun.com/phxiang/article/details/70339654</link><guid>https://blog.youkuaiyun.com/phxiang/article/details/70339654</guid><author>phxiang</author><pubDate>Fri, 21 Apr 2017 21:30:10 +0800</pubDate><description><![CDATA[大家都知道iOS是基于运行时机制，它是主要由C和汇编编写的库，对C进行了特殊处理，将结构体视为对象，将函数视为方法。C是编译时语言，而OC是动态运行时语言，所以在编译阶段，尽管OC中的方法没有实现也不会报错，而C会报错。在运行时，OC才进行方法的处理。 
runtime中最主要的机制是消息机制。比如：[man run]; 在OC实现中实际为objc_msgSend(man, @selector(ru]]></description><category></category></item><item><title><![CDATA[iOS中的RunLoop]]></title><link>https://blog.youkuaiyun.com/phxiang/article/details/70281902</link><guid>https://blog.youkuaiyun.com/phxiang/article/details/70281902</guid><author>phxiang</author><pubDate>Thu, 20 Apr 2017 18:01:17 +0800</pubDate><description><![CDATA[RunLoop 是 iOS 和 OS X 开发中非常基础的一个概念，这篇文章将从 CFRunLoop 的源码入手，介绍 RunLoop 的概念以及底层实现原理。之后会介绍一下在 iOS 中，苹果是如何利用 RunLoop 实现自动释放池、延迟回调、触摸事件、屏幕刷新等功能的。 
目录
RunLoop 的概念
RunLoop 与线程的关系
RunLoop 对外的接口
RunLoop 的 Mode
Ru]]></description><category></category></item><item><title><![CDATA[IOS内存管理retain，assign，copy，strong，weak]]></title><link>https://blog.youkuaiyun.com/phxiang/article/details/59483483</link><guid>https://blog.youkuaiyun.com/phxiang/article/details/59483483</guid><author>phxiang</author><pubDate>Thu, 02 Mar 2017 10:37:41 +0800</pubDate><description><![CDATA[IOS的对象都继承于NSObject, 该对象有一个方法:retainCount ，内存引用计数。 引用计数在很多技术都用到: window下的COM组件，多线程的信号量，读写锁，思想都一样。(一般情况下: 后面会讨论例外情况) 
alloc 对象分配后引用计数为1 
retain 对象的引用计数+1 
copy copy 一个对象变成新的对象(新内存地址) 引用计数为1 原来对象计数不变relea]]></description><category></category></item><item><title><![CDATA[NSString的retainCount]]></title><link>https://blog.youkuaiyun.com/phxiang/article/details/58143213</link><guid>https://blog.youkuaiyun.com/phxiang/article/details/58143213</guid><author>phxiang</author><pubDate>Mon, 27 Feb 2017 17:01:25 +0800</pubDate><description><![CDATA[字符串常量 
NSString *s = @”test”; 
NSLog(@”s:%d”,[s retainCount]); // -1或2147483647（即UINT_MAX ( Maximum value an `unsigned int’)） 
因为”test”为字符串常量，系统不会收回，也不会对其作引用计数，即使我们对s如何retain或release。
stringWithFormat]]></description><category></category></item><item><title><![CDATA[iOS中的Copy]]></title><link>https://blog.youkuaiyun.com/phxiang/article/details/58142917</link><guid>https://blog.youkuaiyun.com/phxiang/article/details/58142917</guid><author>phxiang</author><pubDate>Mon, 27 Feb 2017 17:00:23 +0800</pubDate><description><![CDATA[iOS提供了copy与mutableCopy方法，copy就是复制了一个不可变的对象，而mutableCopy就是复制了一个可变的对象，下面通过几个实例来演示一下。一、非容器类对象的copy与mutableCopy    NSString *str = [NSString stringWithFormat:@"%@", @"create by "];
    NSLog(@"str： %p 值：%@]]></description><category></category></item><item><title><![CDATA[iOS中 atomic、nonatomic、assign、copy、retain、readonly的定义与区别]]></title><link>https://blog.youkuaiyun.com/phxiang/article/details/58125362</link><guid>https://blog.youkuaiyun.com/phxiang/article/details/58125362</guid><author>phxiang</author><pubDate>Mon, 27 Feb 2017 15:57:34 +0800</pubDate><description><![CDATA[atomic、nonatomic：atomic与nonatomic用来决定编译器生成的getter和setter是否为原子操作。 
atomic：设置成员变量的@property属性时，默认为atomic，提供多线程安全属性。在多线程环境下，原子操作是必要的，否则会引起莫名其妙的BUG。加了atomic，setter函数相当于如下：{lock}
if (property != newValue) {]]></description><category></category></item><item><title><![CDATA[堆与栈]]></title><link>https://blog.youkuaiyun.com/phxiang/article/details/58067880</link><guid>https://blog.youkuaiyun.com/phxiang/article/details/58067880</guid><author>phxiang</author><pubDate>Mon, 27 Feb 2017 14:10:20 +0800</pubDate><description><![CDATA[一、预备知识—程序的内存分配一个由C/C++编译的程序占用的内存分为以下几个部分 
  1、栈区（stack）：由编译器自动分配释放，存放函数的参数值，局部变量的值等。其操作方式类似于数据结构中的栈。 
  2、堆区（heap）：一般由程序员分配释放，若程序员不释放，程序结束时可能由OS回收。注意它与数据结构中的堆是两回事，分配方式倒是类似于链表。 
  3、全局区（静态区static）：包含两个分]]></description><category></category></item><item><title><![CDATA[多线程同步问题]]></title><link>https://blog.youkuaiyun.com/phxiang/article/details/56830947</link><guid>https://blog.youkuaiyun.com/phxiang/article/details/56830947</guid><author>phxiang</author><pubDate>Fri, 24 Feb 2017 09:20:21 +0800</pubDate><description><![CDATA[说到多线程就不得不提多线程中的锁机制，多线程操作过程中往往多个线程是并发执行的，同一个资源可能被多个线程同时访问，造成资源抢夺，这个过程中如果没有锁机制往往会造成重大问题。举例来说，每年春节都是一票难求，在12306买票的过程中，成百上千的票瞬间就消失了。不妨假设某辆车有1千张票，同时有几万人在抢这列车的车票，顺利的话前面的人都能买到票。但是如果现在只剩下一张票了，而同时还有几千人在购买这张票，虽然]]></description><category></category></item><item><title><![CDATA[iOS信号量机制]]></title><link>https://blog.youkuaiyun.com/phxiang/article/details/56679993</link><guid>https://blog.youkuaiyun.com/phxiang/article/details/56679993</guid><author>phxiang</author><pubDate>Thu, 23 Feb 2017 20:36:12 +0800</pubDate><description><![CDATA[记得之前有讲解过iOS多线程的处理，当时使用GCD的时候还有很多没有讲太清楚的地方，今天做一个小小的补充： 
使用NSOperationQueue可以控制并发线程，但是如何在GCD中快速的控制并发呢？这里就需要使用到信号量（dispatch_semaphore）。信号量是一个整型值并且具有一个初始计数值，并且支持两个操作：信号通知与等待。当一个信号被信号通知，其技术会被增加。当一个线程在一个信号量上]]></description><category></category></item><item><title><![CDATA[Block的详细分析（二）]]></title><link>https://blog.youkuaiyun.com/phxiang/article/details/56675530</link><guid>https://blog.youkuaiyun.com/phxiang/article/details/56675530</guid><author>phxiang</author><pubDate>Thu, 23 Feb 2017 16:39:40 +0800</pubDate><description><![CDATA[一，前言在前文《深入浅出Cocoa多线程编程之block与dispatch quene》中我介绍了 block 的一些基本语法以及如何和 GCD 结合的使用示例。block 是在 iOS 4 中引入的新特性，它和 C++ 11 中的 lamba 表达式概念相似，有时候也被称为闭包。经过一段时间的使用，我发现要用对用好 block 还是有不少需要注意的地方，今天就来八一八这些值得注意的事儿。二，blo]]></description><category></category></item><item><title><![CDATA[Block的详细分析]]></title><link>https://blog.youkuaiyun.com/phxiang/article/details/56672581</link><guid>https://blog.youkuaiyun.com/phxiang/article/details/56672581</guid><author>phxiang</author><pubDate>Thu, 23 Feb 2017 15:10:35 +0800</pubDate><description><![CDATA[block 是 Apple 在 GCC 4.2 中扩充的新语法特性，其目的是支持多核并行编程。我们可以将 dispatch_queue 与 block 结合起来使用，方便进行多线程编程。1，实验工程准备在 XCode 4.0 中，我们建立一个 Mac OS X Application 类型的 Command Line Tool，在 Type 里面我们选择 Foundation 就好，工程名字暂且为]]></description><category></category></item></channel></rss>