前段时间一直在写 swift, 最近 又来写 Objc ,发现 语法确实是差了点,表现力不足, 缺乏高阶函数, 这不 自力更生 写了一个~

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
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
#pragma mark - Map, filter, reduce, flatMap function without class restrictor
- (NSArray *)map:(id (^)(id obj))block {
    NSMutableArray *mutableArray = [NSMutableArray new];

    [self enumerateObjectsUsingBlock:^(id obj, NSUInteger idx, BOOL *stop) {
        [mutableArray addObject:block(obj)];
    }];
    return mutableArray;
}

- (NSArray *)filter:(BOOL (^)(id obj))block {
    NSMutableArray *mutableArray = [NSMutableArray new];

    [self enumerateObjectsUsingBlock:^(id obj, NSUInteger idx, BOOL *stop) {
        if (block(obj) == YES) {
            [mutableArray addObject:obj];
        }
    }];
    return mutableArray;
}

- (id)reduce:(id)initial
       block:(id (^)(id obj1, id obj2))block {
    __block id obj = initial;

    [self enumerateObjectsUsingBlock:^(id _obj, NSUInteger idx, BOOL *stop) {
        obj = block(obj, _obj);
    }];
    return obj;
}

- (NSArray *)flatMap:(id (^)(id obj))block {
    NSMutableArray *mutableArray = [NSMutableArray new];

    [self enumerateObjectsUsingBlock:^(id obj, NSUInteger idx, BOOL *stop) {
        id _obj = block(obj);
        if ([_obj isKindOfClass:[NSArray class]]) {
            NSArray *_array = [_obj flatMap:block];
            [mutableArray addObjectsFromArray:_array];
            return;
        }
        [mutableArray addObject:_obj];
    }];
    return mutableArray;
}

- (BOOL)contains:(BOOL (^)(id obj))block {
    __block BOOL contains = NO;

    [self enumerateObjectsUsingBlock:^(id obj, NSUInteger idx, BOOL *stop) {
        if (block(obj) == YES) {
            contains = YES;
            *stop = YES;
        }
    }];
    return contains;
}

- (void)forEach:(void (^)(id obj))block {
    [self enumerateObjectsUsingBlock:^(id obj, NSUInteger idx, BOOL *stop) {
        block(obj);
    }];
}

BLE

BLE是蓝牙低能耗的简称(Bluetooh Low Energy)。蓝牙低能耗(BLE)技术是低成本、短距离、可互操作的鲁棒性无线技术,工作在免许可的2.4GHz ISM射频频段。它从一开始就设计为超低功耗(ULP)无线技术。它利用许多智能手段最大限度地降低功耗

  • GATT:Generic Attribute Profile
  • ATT: Attribute Protocol
  • L2CAP: Logical Link Control and Adaptation Protocol

TDD

Test Drive Development

  • 有利于更加专注软件设计;
  • 清晰地了解软件的需求;
  • 很好的诠释了代码即文档。

TDD

TDD是一种相对于普通思维的方式来说,比较极端的一种做法。我们一般能想到的是先编写业务代码,然后为其编写测试代码,用来验证产品方法是不是按照设计工作。而TDD的思想正好与之相反,在TDD的世界中,我们应该首先根据需求或者接口情况编写测试,然后再根据测试来编写业务代码,而这其实是违反传统软件开发中的先验认知的.

我们可以举一个生活中类似的例子来说明TDD的必要性:有经验的砌砖师傅总是会先拉一条垂线,然后沿着线砌砖,因为有直线的保证,因此可以做到笔直整齐;而新入行的师傅往往二话不说直接开工,然后在一阶段完成后再用直尺垂线之类的工具进行测量和修补。

TDD的好处不言自明,因为总是先测试,再编码,所以至少你的所有代码的public部分都应该含有必要的测试。另外,因为测试代码实际是要使用产品代码的,因此在编写产品代码前你将有一次深入思考和实践如何使用这些代码的机会,这对提高设计和可扩展性有很好的帮助,试想一下你测试都很难写的接口,别人(或者自己)用起来得多纠结。在测试的准绳下,你可以有目的有方向地编码;另外,因为有测试的保护,你可以放心对原有代码进行重构,而不必担心破坏逻辑。这些其实都指向了一个最终的目的:让我们快乐安心高效地工作。

Runtime

Objc是一门动态语言,所以它总是想办法把一些决定工作从编译连接推迟到运行时。也就是说只有编译器是不够的,还需要一个运行时系统(runtime system) 来执行编译后的代码。这就是 Objective-C Runtime. RunTime简称运行时。OC就是运行时机制,其中最主要的是消息机制。对于C语言,函数的调用在编译的时候会决定调用哪个函数。对于OC的函数,属于动态调用过程,在编译的时候并不能决定真正调用哪个函数,只有在真正运行的时候才会根据函数的名称找到对应的函数来调用。

Runtime基本是用C和汇编写的,苹果和GNU各自维护一个开源的runtime版本,这两个版本之间都在努力的保持一致。

id & Class

define id&class

1
2
3
4
5
6
7
8
9
10
11
12
13
!Objc
	typedef struct objc_class *Class;
	typedef struct objc_object *id;
	struct objc_object {
    	Class isa;
	};
	struct objc_class {
    	Class isa;
	}
	/// 不透明结构体, selector
	typedef struct objc_selector *SEL;
	/// 函数指针, 用于表示对象方法的实现
	typedef id (*IMP)(id, SEL, ...);

Define

  • 对对象进行操作的方法一般以object_开头
  • 对类进行操作的方法一般以class_开头
  • 对类或对象的方法进行操作的方法一般以method_开头
  • 对成员变量进行操作的方法一般以ivar_开头
  • 对属性进行操作的方法一般以property_开头
  • 对协议进行操作的方法一般以protocol_开头

根据以上的函数的前缀 可以大致了解到层级关系。对于以objc_开头的方法,则是runtime最终的管家,可以获取内存中类的加载信息,类的列表,关联对象和关联属性等操作。

important method

objc_copyClassList

class_copyIvarList

class_copyPropertyList

ivarList可以获取到@property关键字定义的属性 ,而propertyList不可以获取到成员变量。使用ivarList是可以将所有的成员变量和属性都获取的。

+ (BOOL)resolveClassMethod:(SEL)sel 
+ (BOOL)resolveInstanceMethod:(SEL)sel

class_addIvar

class_addMethod

SVG

  • SVG 指可伸缩矢量图形 (Scalable Vector Graphics)
  • SVG 用来定义用于网络的基于矢量的图形
  • SVG 使用 XML 格式定义图形
  • SVG 图像在放大或改变尺寸的情况下其图形质量不会有所损失
  • SVG 是万维网联盟的标准
  • SVG 与诸如 DOM 和 XSL 之类的 W3C 标准是一个整体

JSON File

作为一个合格的程序员,有太多的理由促使你去编写干净利落且可读性强的代码。最重要的是因为你编写的代码,将来会有很多人一次次地阅读。当你有一天回过头来看自己的代码时,你就会明白编写优雅的代码是多么的重要。另外,如果别人来阅读你编写的代码,你是否想知道别人看到那些烂代码无比抓狂的感受。因此,花多一点的时间去编写优雅的代码,将来说不定会给你节省更多的时间。

那么,如何编写更棒的代码,下面是11条基本规则:

  1. 保持方法简短扼要

  2. 永远永远不要将同一个变量用于不同的目的

  3. 尽可能让变量和方法的名称能够描述要实现的功能

  4. 尽可能将变量定义在最靠近它们的地方

  5. 不要出现让人费解的数字

  6. 要像对待朋友一样对待你擅长的语言

  7. 不要逆常规而行

  8. 千万小心过早的优化代码

  9. 要常常重构经过测试的代码

  10. 不要沉溺于过度的设计技巧

  11. 随时随地学习新的知识

概述


在 iOS 中其实目前有 4 套多线程方案,他们分别是:

  • Pthreads
  • NSThread
  • GCD
  • NSOperation & NSOperationQueue

iOS 9 有个激动人心的新特性 Network Extension 弥补了 iOS 长久以来无法定制底层网络 app 的不足。APN 代理不安全,成本高;虚拟专网速度不佳,爱掉线,阻塞问题严重…

surge

那么对于专业用户来说比较完美的方案必须是安全的,可低成本的,最大网络速度,无连接状态,国内外分流完美的 iOS 方案,那么现在这个堕落的愿望已经实现了,感谢苹果公司这么给(chi)力(dao)的 API 和 app 开发大牛。

Surge.app (App Store)是一款给专业用户使用的网络调试工具,使用比较复杂。它的工作原理是使用 packet tunnel provider,然后给系统套上一个代理,后端转发支持 http 代理,SSL 代理,和 Socks 代理。如果 app 尊重系统代理,就会走这个代理,如果不尊重,我们也可以通过规则强制流量走系统 tun 设备达到支持全部 app 的目的。用代理的好处是可以跟踪和调试网络,容易分流,ACL 功能更多,弹性更大更方便。

redex

去年,Facebook使用叫ReDex的字节码优化工具优化了他们的安卓应用的性能.

现在,ReDex已经开源了。安卓开发者可以免费地使用这个工具优化自己的应用。也可以将它用作其它安卓字节码优化工具的基础。