0%

如今也是入了移动iOS开发的坑,最近不仅学习了Core Animation的部分知识,还接触到React Native,这一Facebook出品的React for Native Platform框架,其中React本身入门是相对简单的,而Redux入门就相对困难了,因此在这里总结一下,最后有自己写的Slides可以参考

背景

为什么需要Redux

  1. RN的state(可变,子组件不可见)和props(不可变,子组件可见)的设计,在面对大型项目时候,容易因为不经意修改state造成状态混乱,组件渲染错误
  2. RN使用了Virtual DOM,不需要Target绑定->Action修改UI属性,只要当状态变化,render新状态下的组件,数据单向传递,而MVC的设计模式存在双向数据流
  3. RN不易进行测试,Redux提供了非常方便的mock测试方式

准备

1
2
3
4
5
6
安装Redux:
npm install --save redux
安装React Native和Redux绑定库:
npm install --save react-redux
安装Redux Thunk异步Action中间件:
npm install --save redux-thunk
阅读全文 »

这是补充记录关于CG的几何变换的一些知识,涉及到简单的矩阵变换

变换矩阵

在Core Graphics进行图层缩放、旋转、平移的时候,本质的操作就是使用CGAffineTransform这个3x2矩阵对象,与我们的CGPoint这个1x2的矩阵(其实就是对应就是[x,y]这个向量)进行矩阵相乘操作,得到的新矩阵就是变换后的新向量。一般通过CALayer得到的图层都是矢量,因此可以把整个图层进行相应的缩放、旋转、平移。

1
2
3
4
5
6
7
8
typedef struct CGAffineTransform { 
CGFloat a;
CGFloat b;
CGFloat c;
CGFloat d;
CGFloat tx;
CGFloat ty;
} CGAffineTransform;

这个结构体对应的矩阵如下(看不到LaTeX公式的请看Apple Developer Document):

$ \begin{bmatrix} a & b & 0 \\ c & d & 0 \\ t_{x} & t_{y} & 1 \end{bmatrix} $

阅读全文 »

最近一段时间到南京某公司实习之后,就一直没有更新博客,而校招季节到来,也是投了几家公司,之前不发面经是担心有泄题之类的风险,而且自己也需要调整一下心态。而现在,终于可以谈谈iOS开发的面试了

面试技术栈

技术岗位面试,基本上离不开这三方面的东西:

  • 数据结构与算法
  • 语言/框架方面基础知识
  • 通用知识,项目

所以今天专门整理了一些最近的面试中遇到的问题,对自己的能力也正确的评价一下

#数据结构与算法

阅读全文 »

Objective-C中的block是一种特别的结构,block与普通的instance不同的地方,不止更在于它的语法,更在于它的不同表现以及内存分配。

虽然block对于Objective-C来说已经早不新鲜了,但现如今很多博文讲述的block行为是基于MRC的,这与ARC下的表现是不同的。现代Objective-C也应该渐渐淘汰MRC和GC(其实GC已经淘汰了,在macOS Sierra已经无法使用,iOS从来不支持)本文所提及情况均限于ARC

ARC下不同类型的block表现

很多博文都提到过,block通过llvm编译后,会生成对应的三种Class的实例变量,分别是:NSStackBlockNSGlobalBlockNSMallocBlock,分配区域分别位于进程的栈,TEXT段,堆。ARC下为了简化block的内存管理,以及性能优化,llvm会对不同情形下的block进行不同的类型变化,

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
int a = 1;
NSString *string = @"";

NSLog(@"%@", NSStringFromClass([^(){} class]));

NSLog(@"%@", NSStringFromClass([^(){
int b = a;
} class]));

void (^block1)(void) = ^{
int b = 2;
};
NSLog(@"%@", NSStringFromClass([block1 class]));

void (^block2)(void) = ^{
NSString *b = string;
};
NSLog(@"%@", NSStringFromClass([block2 class]));

猜猜输出是什么?

阅读全文 »

最近偶然间发现《命运石之门:线形拘束的表征图》(STEINS;GATE 线形拘束のフェノグラム)iOS版的汉化基本完成,只缺测试,于是加入帮忙汉化组……在这中间偶然间学到一些关于iOS逆向和字体相关内容

字体问题

游戏是基于iOS UIKit以及Cocos游戏引擎写的(动画效果是Cocos的,文本框是定制的UITextField,而Backlog就是个UIScrollView……)本身支持UTF-8,覆盖汉化脚本后运行,却发现字体渲染不正常,出现了两种字体渲染(看图,”喵”明显是黑体-简,即iOS9之前默认的简体中文字体),更会有很多汉字变为日文汉字(”变” -> “変”,”归” -> “帰”)

起初并没有理解问题,最后查资料才认识到这是iOS字体Fallback所导致的。在查阅资料时候也发现一个异常好用的iOS字体对比渲染网页:iosfonts,直接输入文字,即可查看各种当前固件各种font family的效果(最好用Safari访问,OS X访问的话,相当于查看当前OS X的font family)

阅读全文 »

Xcode or Reveal

在iOS开发中,UI调试总是一个大问题……原始的暴力调试(View强行着色然后看,或者在@Selector中直接把viewForLastBaselineLayout或者viewForFirstBaselineLayout)利用Swizzle Hook,然后Debug输出相应的内容(比如View的属性,描述符等等)。

这是一个好方法……但是过于暴力,而且非常不直观。虽然iOS开发者都知道的Reveal是好东西,然而价格并不是人人都买得起……(不过对iOS专业开发者确实是一个必备的工具)。其实Xcode 7自带了一套UI调试的工具,熟悉使用之后也是非常好用。

使用

使用方法很简单,首先自然得运行项目,然后Run(Command R),然后切换到Debug栏(Command 6),点击左边栏最右侧的图表,选择View UI Hierarchy即可。

阅读全文 »

前提说明:

自己是在北邮论坛中找的学长内推,当时与学长问了关于阿里前端中是否有偏向JavaScript开发(中间件,工具库)的方向,学长说只有杭州有类似岗位,最后把我内推到了淘宝UED的团队去了。

简历说明中侧重讲了关于Node.js的经历,JavaScript轮子的介绍以及一些使用了Node.js技术栈的Web项目。这点对于前端实习也是一个加分项。

一面:

一面面试官问了大概有4年开发经验(包括了Java和JavaScript),上来除了标准的自我介绍以外,大概主要谈论了关于Node.js,JavaScript语法以及Web开发的领域,对简历中提到的项目稍微深入问了一下。

  1. babel或者coffee Script的这些编译到JS的语言是如何工作的?
    这个问题是最纠结的,因为不太清楚面试官想问什么,大概说了关于Parse的东西,后面补充了关于babel的递归引用JS文件处理的东西,估计有问题。

  2. JavaScript的Async库基本原理是什么?
    这个网上都有,就是Async的parrllel,waterfall的简单实现,讲出了把callback function替换this域,用一个list来遍历执行,把最终的error或者result参数填回到Async.parallel([functionList], callback(err,result))中,差不多

  3. 你写的Functional.js中monad, curry, lazy的解释和意义?
    基本面向简历的作品,讲解了一点关于monad的简单意义(包裹,传递流,防止外部更改),curry化对JS库函数的意义,还有lazy list或者range对于那种大量数据处理的好处什么的。

  4. Node.js框架同其他语言框架的比较?
    答出Node.js特色的非阻塞IO和异步性,和Python的Flask对比,再讲解一下express中间件这种模式的特点,差不多了

  5. Node.js与Swift在Web领域的未来?(因为我简历写了iOS开发和Swift)
    随便扯吧……就是强类型的问题,基于原型面向对象优劣,语法糖的问题,还有支持库什么的。

阅读全文 »

编译原理已经学了很多了吧?还有所迷茫?那么今天跟着我一起学习如何暴力写一个Parser Generator

Why Java:

因为Java有着丰富的对开发人员傻瓜式友好的内置数据结构,什么Map,Set,Stack,求交集求并集也就一句a.contains(b);a.addAll(b)的事情,并且不需要担心资源泄漏(?)的问题,对于我们的暴力实现非常有帮助。而且相比C++我也更为熟悉..

What is parser generator

这里就指的是支持用户输入CFG(Context-free grammar),然后生成出一个Java代码,这个代码可以编译以后得到一个Parser用来Parse符合输入CFG定义的文法,类似于Yacc

迷糊了?举个例子,就是假如用户定义了这样一组CFG,用来匹配一个对于正整数的加法和乘法

阅读全文 »