0%

FRP全称Function Reactive Programming,从名称就能够看出来这个模型关键就是Function Programming和Reactive Programming的结合。那么就先从函数式编程说起。说函数式编程前先聊聊链式编程,先看看一个开源Alert控件的头文件里定义的接口方法的写法。

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

/*

* 自定义样式的alertView

*

*/

+ (instancetype)showAlertWithTitle:(NSString *)title

message:(NSString *)message

completion:(PXAlertViewCompletionBlock)completion

cancelTitle:(NSString *)cancelTitle

otherTitles:(NSString *)otherTitles, ... NS_REQUIRES_NIL_TERMINATION;

/*

* @param otherTitles Must be a NSArray containing type NSString, or set to nil for no otherTitles.

*/

+ (instancetype)showAlertWithTitle:(NSString *)title

contentView:(UIView *)view

secondTitle:(NSString *)secondTitle

message:(NSString *)message

cancelTitle:(NSString *)cancelTitle

otherTitles:(NSArray *)otherTitles

btnStyle:(BOOL)btnStyle

completion:(PXAlertViewCompletionBlock)completion;

阅读全文 »

当项目越来越大,引入第三方库越来越多,上架的APP体积也会越来越大,对于用户来说体验必定是不好的。在清理资源,编译选项优化,清理无用类等完成后,能够做而且效果会比较明显的就只有清理无用函数了。现有一种方案是根据Linkmap文件取到objc的所有类方法和实例方法。再用工具逆向可执行文件里引用到的方法名,求个差集列出无用方法。这个方案有些比较麻烦的地方,因为检索出的无用方法没法确定能够直接删除,还需要挨个检索人工判断是否可以删除,这样每次要清理时都需要这样人工排查一遍是非常耗时耗力的。

这样就只有模拟编译过程对代码进行深入分析才能够找出确定能够删除的方法。具体效果可以先试试看,程序代码在:https://github.com/ming1016/SMCheckProject 选择工程目录后程序就开始检索无用方法然后将其注释掉。

阅读全文 »

断点和调试器交互

help命令

  • help 列出所有命令
  • help 列出某个命令更多细节,例如help print

print

  • print 打印需要查看的变量,例如print totalCount
  • print 还能使用简写prin, pri, p
  • po(print object)可以打印对象的description方法的结果
  • 打印不同格式可以用p/x number打印十六进制,p/t number打印二进制,p/c char打印字符。这里是完整清单https://sourceware.org/gdb/onlinedocs/gdb/Output-Formats.html

expression

阅读全文 »

UINavigationControllerDelegate中相关方法

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

- (id<UIViewControllerAnimatedTransitioning>)

navigationController:(UINavigationController *)navigationController

animationControllerForOperation:(UINavigationControllerOperation)operation

fromViewController:(UIViewController*)fromVC

toViewController:(UIViewController*)toVC

{

if (operation == UINavigationControllerOperationPush) {

//可以给每个转场创建新的animator对象,或者共用同一个animator

return self.animator;

}

return nil;

}

阅读全文 »

视图层级

UIView有三个基类:UIResponder,UIView和UIControl。

  • UIResponder:是UIView的父类。responder处理触摸,手势,远程控制事件。UIApplication和UIViewController也是UIResponder的子类。
  • UIView:处理绘制和触摸时间。
  • UIControl:有target/action模式。button,Date pickers,文本框都是。

渲染

避免使用drawRect:在CPU上做渲染,如果希望使用GPU渲染就使用现有的视图构建自定义视图。如果要实现一个带边框的圆形头像

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15

- (void)setupView

{

self.clipsToBounds = YES;

self.layer.cornerRadius = self.bounds.size.width / 2;

self.layer.borderWidth = 3;

self.layer.borderColor = [UIColor darkGrayColor].CGColor;

}

阅读全文 »

简介

PhotoKit比AssetsLibrary的特性更多表现更好。可以观察照片库的变化和创建提交自己修改的改变。官方代码示例https://developer.apple.com/library/ios/samplecode/UsingPhotosFramework/Introduction/Intro.html#//apple_ref/doc/uid/TP40014575 ,WWDC session视频

PhotoKit对象模型

所有PhotoKit对象都继承PHObject抽象类,公共接口只提供localIdentifier属性。

  • PHAsset:表示照片库里单独资源以提供资源元数据。
  • PHAssetCollection:表示资源集合,是PHCollection的子类。单独的资源集合可以是照片库里的相册或智能相册,包括所有的视频集合,最近添加项目,用户收藏,所有连拍照片等。
  • PHCollectionList:表示一组PHCollections。在照片应用可以看到它,照片 - 时刻 - 精选 - 年度

Fetch照片实体

阅读全文 »

介绍

OpenCV是开源计算机视觉和机器学习库。包含成千上万优化过的算法。项目地址:http://opencv.org/about.html。官方文档:http://docs.opencv.org/modules/core/doc/intro.html。OpenCV已支持OpenCL OpenGL,也支持iOS和Android。OpenCV的API是C++的,所以在iOS中最佳实践是将用到OpenCV功能写一层Objective-C++封装。这些封装把OpenCV的C++API转化为安全的Objective-C API。

模块

  • core:简洁核心模块,基本函数,基本数据结构
  • imgproc:图像处理模块,线性和非线性图像滤波,几何图像转换,颜色空间转换,直方图等。
  • video:视频分析模块,运动估计,背景消除,物体跟踪算法
  • calib3d:基本多视角几何算法,单体和立体相机的标定,对象姿势估计,双目立体匹配算法和元素的三维重建
  • features2d:包含了显著特征检测算法,描述算子和算子匹配算法
  • objdetect:物体检测和一些预定义的物体的检测(如人脸,眼睛,杯子,人,汽车等)
  • ml:多种机器学习算法,如K均值,支持向量机和神经网络
  • highgui:简单易用接口,有视频捕捉,图像和视频编码功能,简单UI接口,iOS的是其中一个子集
  • gpu:GPU加速算法,iOS不可用
  • ocl:OpenCL通用算法,iOS不可用
  • 其它辅助模块,如用户贡献的算法
阅读全文 »

AutoLayout的一些基本概念

  • 利用约束来控制视图的大小和位置,系统会在运行时通过设置的约束计算得到frame再绘制屏幕
  • 两个属性Content Compression Resistance(排挤,值越高越固定)和Content Hugging(拥抱),Masonry代码如下
1
2
3
4
5
6
7
8
9
10
11
12
13

//content hugging 为1000

[view setContentHuggingPriority:UILayoutPriorityRequired

forAxis:UILayoutConstraintAxisHorizontal];

//content compression 为250

[view setContentCompressionResistancePriority:UILayoutPriorityDefaultLow

forAxis:UILayoutConstraintAxisHorizontal];

阅读全文 »

本文详细介绍了 iOS 中 GCD(Grand Central Dispatch)的使用方法,包括队列类型、同步异步操作、Dispatch Source、锁机制等内容,并通过实例讲解了 GCD 死锁情况和性能优化技巧,适合 iOS 开发者学习多线程编程。

阅读全文 »

简介

block可以当做匿名函数,可以在两个对象间将语句当做数据来进行传递。具有封闭性closure,方便取得上下文相关状态信息。简单 block 定义就像函数指针,用^替代了*。

Block的创建

  • 可以如声明函数那样声明一个block变量
  • 定义函数的方法定义block
  • 把block当做一个函数来调用
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
int main(int argc, const char * argv[]) {
@autoreleasepool {
// Declare the block variable
double (^distanceFromRateAndTime)(double rate, double time);
// Create and assign the block
distanceFromRateAndTime = ^double(double rate, double time) {
return rate * time;
};
// Call the block
double dx = distanceFromRateAndTime(35, 1.5);
NSLog(@"A car driving 35 mph will travel "
@"%.2f miles in 1.5 hours.", dx);
}
return 0;
}
阅读全文 »