一篇入门Kotlin
1. 变量与函数1.1 变量1.1.1 类型推导“类型推导”是现在编程语言都喜欢的一个特性,如C++的auto、Swift的let、var、Java 的 var等。Kotlin同样如此,你可以使用val(value)定义常量,var(variable)来定义变量。
对于常量来说,每当定义以后,其值是不可修改的
1234fun main() { val number = 1 // number 会被推导为 Int println("number = " + number) // > number = 1}
如果你要去修改这个 number,那么就会出现错误
1234fun main() { val number = 1 number = 2 // error: Val cannot be reassigned}
需要可变的量,我们需要使用 var 来修饰。
1234567fun main() { var number = 1 println("number = ...
iOS视频捕获进阶篇
1. 前言前面【iOS视频捕获实践篇】制作了一个简单拍照和视频录制的相机,事实上,大多数app都有扫码的功能,因此仅仅一个相机是不够的。本篇文章来对前面的相机做一个升级,对拍照界面增人脸检测与追踪的功能。
2. MetadataOutputAVCaptureOutput有一个子类 AVCaptureMetadataOutput,它用来输出元数据。元数据简单来说就是现实一个具体的物体,比如人脸、条码、动物等,所有元数据对象都有时间、持续时间、界限和类型。下面是一个元数据的抽象类,我们需要使用其子类。
123456@interface AVMetadataObject : NSObject {@property(readonly) CMTime time;@property(readonly) CMTime duration;@property(readonly) CGRect bounds;@property(readonly) AVMetadataObjectType type;@end
在使用上和AVCaptureVideoDataOutput是类似的。设置一个代理和一个 ...
iOS视频捕获实践篇
该demo以ToyCamera命名
常用类、方法、属性已在【iOS视频捕获入门篇】介绍。@[toc]
1. 视频流1.1 设备与输入前面提到我们不能直接设备,而是需要用一个输入对象将设备封装。先来提供一个前置摄像头和一个后置摄像头。(后置摄像头我们只使用一个)
12345678910111213141516- (AVCaptureDevice *)videoFrontDevice { if (!_captureDevice || self.captureDevice.position != AVCaptureDevicePositionFront) { AVCaptureDeviceDiscoverySession *session = [AVCaptureDeviceDiscoverySession discoverySessionWithDeviceTypes:@[AVCaptureDeviceTypeBuiltInDualCamera, AVCaptureDeviceTypeBuiltInTelephotoCamera,AVCaptur ...
iOS视频捕获入门
1. AVFoundation简介AVFoundation 是 OSX 系统和 iOS 系统中用于处理基于时间的媒体数据的高级框架,AVFoundation的设计过程高度依赖多线程机制,充分利用多核硬件优势,大量使用 Block 和 GCD 机制将运算任务放在子线程,且提供硬件加速确保最佳性能。简单说如果你的应用程序需要使用到高级媒体捕捉、媒体编辑可以使用 AVFoundation 来完成。AVFoundation 框架在iOS的架构如下:
使用AVKit框架即可实现简单的视频文件播放。UIImagePickerController可以实现简单的拍照以及视频录制。
2. 视频捕捉
AVFoundation框架内容比较多的,这里通过视频捕捉来入门AVFoundation。如果想深入学习,可以进入官网:苹果官方AVFoundation框架介绍AVFoundation框架推荐阅读《AVFoundation 开发秘籍》
视频流捕捉框架图如下:整体由输入、输出、会话层、连接、设备组成。对于每一个部分都有相应的类,下面分别介绍这几个类,后面会有实践。
3. AVCaptureSessionA ...
Swift类的构造规则
1. 引言在中文版 Apple 官方 Swift 教程已有构造过程,毕竟是官方文档,其构造过程章节非常的详尽,一次将所有的构造机制都写了,但是这会导致首次阅读是很难完全消化,阅读完后感觉没读一样。如果配合实践的话,该章节读完还是要花点时间的。本篇是记录 Swift 中类的构造规则的笔记,用于交流和巩固,值类型的构造规则不在本篇讨论。
2. 两段式构造直接上强度。
如果已经阅读过 swift 构造过程章节,会知道 swift 的两段式构造和我们了解的其他面向对象的构造过程是不一样的。对此,我们可以对比来看。不过先介绍两个 swift 的概念。
2.1 指定构造器和便利构造器2.1.1 概念一般情况下,我们在设计构造方法时,会有一个参数列表非常详尽的方法,也会有参数列表比较短的方法,因为这会很方便的构造对象。用OC举例,比如:
1234567891011121314151617@interface Person : NSObject- (instancetype)initWithName:(NSString *)name age:(NSUInteger)age height:(CGFloa ...
GitHub多账号管理
1. 背景在工作时,不管是使用gitlab还是公司自己基于git建立的代码托管系统,我们都会拥有一个使用公司邮箱注册一个github账号。但我们总归需要有自己的‘私人空间’,比如自己写一些demo,或者作为云盘等。此时就需要一台电脑管理 2个及以上的github账号。
**注:一定要关注公司的围墙红线,不要将公司相关资产上传至github等公共场所**注:一定要关注公司的围墙红线,不要将公司相关资产上传至github等公共场所**注:一定要关注公司的围墙红线,不要将公司相关资产上传至github等公共场所
2. 思路ssh连接方式小使用到RSA技术,如果我们没有改动过ssh的默认目录,那么我们会在~/.ssh目录下看到两个秘钥和一个文件
id_rsa:私钥
id_rsa.pub:公钥
known_hosts:远程服务器ip及公钥,用于验证服务器公钥是否更改
此时好需要一个配置文件,git在解析的时候会读取配置文件,从而获取相应账号的秘钥,具体配置稍后说明。
具体步骤:
1)生成不同名称的秘钥
2)更改配置文件
3)取消全局用户名
3. 实操ssh-keygen:生成、管理 ...
设计模式笔记前瞻
1. 软件设计1.1 复杂性首先以《大话设计模式》一书中的一个例子来引入:
话说曹操在大胜之后,宴请文武,在酒酣耳热的时候,诗兴大发,不觉吟到:”喝酒唱歌,人生真爽……“。众文武称:”好诗!“,于是一臣子命印刷工匠去印刷,以便流传天下。那个时候活字印刷术还没出现,都是先直接雕刻整体,也就是在一个板子上刻完。工匠刻完后,将样张呈现给曹操一看,曹操感觉不妥,说道”喝与唱此话过俗,应改为“对酒当歌较好。于是此臣就命工匠重新来过。工匠眼看连夜刻版之工,彻底白费,心中叫苦不选,只得照办。样张再次出来请曹操过目,曹操细细一品,觉得还是不好,说:”人生真爽太过直接,不够意境,因此应改为“对酒当歌,人生几何?当臣转告工匠之时,工匠卒。
从事软件开发方向的开发者们知道,软件产品的功能迭代速度是非常快的,软件设计的复杂性,究其根本就是—变化。一个产品在众多版本的迭代后,其复杂性越来越大,可维护性越来越低,最终犹如空中楼阁,摇摇欲坠。
1.2 解决如何解决复杂性?
可以借助【快排】【归并】的思想——即分而治之,将大问题分解为多个小问题,将复杂问题分解为多个简单问题。
还有就是用面向对象的思想抽象: ...
Runloop
1. 引子Runloop是iOS开发的一个老生常谈的话题,网上的资料也是很多,但是我想了解的关键地方总是一笔带过,因此自己看源码,进行了资料补充,从头开始。
不再想以教程的方式来写总结了,真正的教程在各大知名网站上均有,日后博文将抽丝剥茧,关键的地方进行雕琢。
2. RunLoop为什么需要RunLoop。
12345678910void func1() { }void func() { func1();}int main() { func(); return 0;}
上面这个程序,在线程执行完main函数后,就结束了,什么也没了。但是手机APP不行,手机APP需要保活,在任何时候需要响应用户的操作以及系统的事件。让程序不结束的方案就是循环。此时Loop就出现了。
123do{}while(exit)
另外一个问题就是:不能一直空循环,因为空循环是对CPU的浪费。
走进源码了解RunLoop,NSRunLoop 是基于 CFRunLoopRef 的封装,提供了面向对象的 API,但是这些 ...
autoreleasepool
1. @autoreleasepool在ARC下,已经禁止使用NSAutoreleasePool类创建自动释放池,只能使用@autoreleasepool。。通常情况下我们不需要手动创建自动释放池,但是如果我们在循环中创建了很多临时的autorelease对象,则手动创建自动释放池来管理这些对象可以很大程度地减少内存峰值。例如,在循环中,创建或使用大量的图片对象。
12345int main(int argc, const char * argv[]) { @autoreleasepool {} return 0;}
将上面的代码,用clang进行编译一下,clang -rewrite-objc main.m
1234567891011struct __AtAutoreleasePool { __AtAutoreleasePool() {atautoreleasepoolobj = objc_autoreleasePoolPush();} ~__AtAutoreleasePool() {o ...
一篇入门Swift
1. 读后概述阅读完《the swift programming language 中文版》,对swift语言有了初步的认识。在特点是:swift既是项目开发的编程语言,又有脚本语言的特点;在学习上:swift可以在xcode的playground进行编写,所见即所得,非常适合语法学习。对于swift语言,个人认为就是”站在巨人的肩膀上”的一门语言,及众家之所长。只要熟悉一门主流的编程语言,学习swift的语法都不会太困难。swift和Java语言在某些语法和关键字上面甚是相似,因此在学习时困难不大。当然,对于熟悉C++的同学可以进行类比。同时,swift是一门新生语言,大部分时代潮流技术也在其中,而且有自己独有的一些技巧在其中,非常值得学习。
2. 语法笔记2.1 说明编程语言都是相通的,因此对于基础的语法都是一样。下面主要是对不同的且重要的语法进行了做了笔记,对于已知或类似的语法没有进行细致的说明。
2.2 基础类型1)变量与常量
swift用let定义常量,用var定义变量。对于数据类型则swift自行推断(类型推倒在C++中相当于auto这个类型占位符一样)。常量在设定后,将不 ...