最近整理项目,发现用到了很多第三方的SDK,这些SDK都是直接拖到项目里面的比较乱,打算把这些乱七八糟的第三方SDK全都交给 CocoaPods 来管理。

什么是CocoaPods?

一脸懵逼
你不知道 CocoaPods 是什么?给你个传送门 https://cocoapods.org

CocoaPods 新建本地仓库

这里我用微信 SDK 来举个栗子,从微信开发者中心下载对应的 SDK。

CocoaPodsSDK

前言

在iOS7之前我们可以通过- (NSString *)uniqueIdentifier这个方法获取iPhone的唯一标识符,也叫作UDID。不过自从iOS7苹果就把这个方法给禁了,此时我们想要获取iPhone的唯一标识符就很困难。
不过苹果提供一个叫做IDFA的标识符,这个IDFA是广告标识符用来追踪广告投放的,不过用户可以在设置中手动重置IDFA,可靠性很低,目前常见的两种标记iPhone的方式为

  • openUDID
  • IDFA或UUID+keychain

这两种模式都有个弊端,用户重置手机或者刷机唯一标识符会发生变化,不过对于大多数情况是够用了。看来苹果是把路给封死了,有没有办法拿到之前的UDID呢?我们注意到iPhone的设置通用关于里面有手机的硬件信息,其中有一个serialNumber,这个serialnumber就是我们查询手机是否过保的依据,那么它肯定是唯一的,所以下文是围绕这个进行的探索。最终是可以拿到这个serialNumber的, 不过由于苹果的沙盒限制,所以只能在越狱机中拿到,如果想在非越狱机中拿到必须添加entitlements文件来获取权限,可想而知这个应用是无法上架的。下文仅作为逆向工程的一种思路和探索

serial NumberUDID

平时在写js代码时会用到一些简单的计算,比方说系统中我们数据库储存的金额是分,前端展示的是元,所以在用户输入元之后要转成分传给后台,这个公式小学一年级就学过了

1
1.11*100 = 111

一般来说这个计算结果是没问题的,但是在js里面却有这样的尴尬

1
1.11*100 = 111.00000000000001

结果不是我们想要的111,类似的情况还有

1
2
3
4
0.1+0.2 = 0.30000000000000004   //加法
0.27-0.11 = 0.16000000000000003 //减法
19.9*100 = 1989.9999999999998 //乘法
0.3/0.1 = 2.9999999999999996 //除法

一般遇到这种问题,我们都有成熟的解决方案解决

用着用着就习惯了,一直没有搞清楚为什么会有这样的误差。这两天正好有空,看了一些博客终于搞清楚了。

JS双精度浮点数据误差

一、 RunLoop初识

日常的开发工作中,我们几乎很少注意RunLoop,因为我们基本上“用不到”RunLoop。包括我在内应该有很多人都不了解这个东西,只是听说过。最近有空查了不少资料终于把RunLoop运行原理搞清楚了。
本文会对RunLoop的原理进行深入探讨,但是不涉及底层的实现。
我们平时开发中的很多东西都和RunLoop相关,比如:

RunLoopNSTimerAutoreleasePoolAFNetworking

下文的讨论基于ARC

平时开发中我们遇到block里面引用self的情况,大部分都是这样处理的

1
2
3
4
5
6
__weak typeof(self) weakSelf = self;
self.myBlock = ^{
__strong typeof(self) strongSelf = weakSelf;
[strongSelf doSomething];
[strongSelf doSomethingElse];
};

转载请注明出处:来自LeonLei的博客http://www.gaoshilei.com  

我们习惯了这样用,貌似这样用了之后可以解决循环引用的问题,而且可以保证block执行之前self不会被释放掉?真相总是残酷的,然而事实并非如此!下面将会对block中引用self的三种方式进行讨论,并给出原因和另外一种解决方案。

blockretain cycle

当我们用cocopods管理第三方类库时,经常遇到编译报错的问题:

1
2
3
4
5
6
7
8
9
`Undefined symbols for architecture x86_64:
"_OBJC_CLASS_$_AFHTTPRequestOperation", referenced from:
objc-class-ref in ZRAPIClient.o
"_OBJC_CLASS_$_AFHTTPRequestSerializer", referenced from:
objc-class-ref in ZRAPIClient.o
"_OBJC_CLASS_$_AFJSONResponseSerializer", referenced from:
objc-class-ref in ZRAPIClient.o
"_OBJC_CLASS_$_BITHockeyManager", referenced from:
objc-class-ref in ZRAppDelegate.o`
XcodeCocopods