Kealdish's Studio.

Kealdish's Studio.

just focus

抽丝剥茧之block(上)
block在iOS下的应用场景非常广泛,相比于delegate严谨繁琐的语法,block则更加灵活。因而,深入理解block还是很有必要的,以免在开发过程中踩到坑。整个关于block的系列着重点不在于介绍block的定义和使用,而是着眼于block中的关键概念以及难以理解的地方,系列索引在这里: 抽丝剥茧之block(上) 抽丝剥茧之block(下) 问题和结论本篇主要的探讨的问题是声明block变量时的修饰符使用strong还是copy?两者是否有区别? 这里先给出结论:在引入ARC之后,在ARC下使用strong和copy对于block而言,不管是实例变量、局部变量还是全局变量都是没...
深入理解NSMapTable、NSHashTable、NSPointerArray

最近在学习YYCache中的YYDiskCache时,注意到了这段代码:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
/// weak reference for all instances
static NSMapTable *_globalInstances;
static dispatch_semaphore_t _globalInstancesLock;
static void _YYDiskCacheInitGlobal() {
static dispatch_once_t onceToken;
dispatch_once(&onceToken, ^{
_globalInstancesLock = dispatch_semaphore_create(1);
_globalInstances = [[NSMapTable alloc] initWithKeyOptions:NSPointerFunctionsStrongMemory valueOptions:NSPointerFunctionsWeakMemory capacity:0];
});
}
static YYDiskCache *_YYDiskCacheGetGlobal(NSString *path) {
if (path.length == 0) return nil;
_YYDiskCacheInitGlobal();
dispatch_semaphore_wait(_globalInstancesLock, DISPATCH_TIME_FOREVER);
id cache = [_globalInstances objectForKey:path];
dispatch_semaphore_signal(_globalInstancesLock);
return cache;
}
static void _YYDiskCacheSetGlobal(YYDiskCache *cache) {
if (cache.path.length == 0) return;
_YYDiskCacheInitGlobal();
dispatch_semaphore_wait(_globalInstancesLock, DISPATCH_TIME_FOREVER);
[_globalInstances setObject:cache forKey:cache.path];
dispatch_semaphore_signal(_globalInstancesLock);
}
YYCache源码学习

这篇文章并不是对YYCache的设计思路的范范分析,而是对YYCache代码实现的详细分析。一方面YYCache的设计思路作者已经写得比较清楚了,我就没必要再多此一举了,有兴趣的可以到大神的博客去看YYCache 设计思路。从代码层面进行分析,一方面是因为很多思路上的东西很虚理解起来大都很容易,但是要能用代码实现却往往不那么轻松,另一方面是因为代码分析可以学习优秀代码的编码风格以及加深对iOS技术上的理解,这样做给自己带来的帮助或许会更多。

代码结构

YYCache文件数并不多,主要包含四个文件:

  • YYCache
  • YYDiskCache
  • YYMemoryCache
  • YYKVStorage
runtime对containsString方法的小改进

最近做项目过程中版本适配到iOS 7上出现了一点问题,定位分析了一下发现原来是NSstringcontainsString:方法在从中作梗。看了一下文档发现原来containsString:是从iOS 8才加入的,iOS 7 SDK并没有该方法。这个问题解决起来也挺简单的,在iOS 7下可以用如下代码代替containsString:方法:

1
BOOL isContained = [aString rangeOfString:bString].location != NSNotFound

不过,我觉得要在每一个需要调用containsString:方法写一遍有点麻烦,把适配的代码抽离出来写入一个方法倒是可以,但我还是觉得有点麻烦,毕竟懒癌患者。于是,我想到了用runtime运行时机制动态添加containsString:方法就可以一劳永逸了。
实现的原理也很简单,在iOS 7下判断NSString中是否存在containsString:实例方法,若不存在,则动态添加该方法。这样就不用再需要调用containsString:实例方法去判断了。原理很简单,代码也很简单,还是很符合我这个懒癌患者的口味的嘛。

ApplePay线上支付教程

第一部分 准备阶段

1)硬件要求:
iPhone6及更新的设备,还有iPad air2和iPad mini3之后的平板,以及apple watch。具体型号(截止2016年2月):iPhone 6,iPhone 6 Plus,iPhone 6s, iPhone 6s Plus;iPad Air 2,iPad mini 3,iPad mini 4,iPad Pro;还有Apple Watch。

2)系统要求:
iPhone或iPad至少要升到iOS 9.2版,手表至少watch OS 2.1。

3)配置支付环境
1.进入苹果开发者中心,注册App ID。
App ID必须是explicit类型,否则无法使用ApplePay服务。

avatar
Kealdish
Hear my roar.
FRIENDS