iOS小技巧

最近开始记录下自己开发遇到的问题,如果解决了就会记录下来,以便自己日后回顾工作。

测试妹子给我提了一个问题是视图遮挡了,我一看,确实会遮挡,我就加了下面的这段代码

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
- (UIView*)keyboardView
{
    NSArray * windows = [[UIApplication sharedApplication] windows];
    for (UIWindow * window in [windows reverseObjectEnumerator])
    {
        for (UIView * view in [window subviews])
        {
            // UIPeripheralHostView is used from iOS 4.0, UIKeyboard was used in previous versions,UIInputSetContainerView was used iOS 8.0
            if (!strcmp(object_getClassName(view), "UIPeripheralHostView") || !strcmp(object_getClassName(view), "UIKeyboard") ||
                !strcmp(object_getClassName(view), "UIInputSetContainerView"))
            {
                return view;
            }
        }
    }
    return nil;
}

- (UIView*)keyboardViewForView:(UIView *)view
{
    UIView * keyboardView = [self keyboardView];
    if (keyboardView) {
        view = keyboardView.superview;
    }
    return view;
}
这样我们在调用下面的方法keyboardViewForView就能显示出来了。问题得到了解决。

Git Control Version


Javascript学习之基本概念

任何语言的核心都会描述这门语言的最基本的工作原理。而描述的内容又涉及到这门语言的语法、操作符、数据类型、内置功能等用于构建复杂解决方案的基本概念。

语法

区分大小写

标识符


React Native

React-Native 帮助在原生平台打造世界一流的应用体验,使用基于JavaSript和React的结合的开发经验。React-Native的宗旨是更有效的开发全平台的应用。

Native Components

在React-Native你能使用标准平台组件如:iOS的UITabBar以及AndroidDrawer。这个给了你APP标准统一的外观,使用这个平台的生态系统,去保持高质量。这些组件能轻易的嵌入到你的APP中使用,和React组件是差不多的,例如:TabBariOSDrawerLayoutAndroid

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

var React = require('react-native');
var { TabBarIOS, NavigatorIOS } = React;

var App = React.createClass({
  render: function() {
    return (
      <TabBarIOS>
        <TabBarIOS.Item title="React Native" selected={true}>
          <NavigatorIOS initialRoute= />
        </TabBarIOS.Item>
      </TabBarIOS>
    );
  },
});
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
// Android

var React = require('react-native');
var { DrawerLayoutAndroid, ProgressBarAndroid, Text } = React;

var App = React.createClass({
  render: function() {
    return (
      <DrawerLayoutAndroid
        renderNavigationView={() => <Text>React Native</Text>}>
        <ProgressBarAndroid />
      </DrawerLayoutAndroid>
    );
  },
});

异步执行

所有的Javascript应用程序代码以及原生平台的操作都是异步的,并且原生模块也能够使用额外的线程。这意味着我们能关闭主线程的图像解码,后台把图片保存到磁盘,渲染文字和计算布局而不会阻塞UI。这样一来,React-Native应用自然流畅性和响应。通信也完全序列化,这使我们能够充分利用Chrome开发者工具来调试Javascript的运行时完整的应用程序,无论是模拟器还是真实设备。

Read on →

记录一次修改Swift的错误

screen-shot-0 screen-shot-1 screen-shot-2 screen-shot-3 screen-shot-4 screen-shot-5 screen-shot-6 screen-shot-7


2015年度总结

目录

  1. 北漂的过去
  2. 我所拥有的现在
  3. 展望未来
  4. 工作总结

一、北漂的过去

今年我结束了我长达4年多的北漂生活,也同时结束了我长达4年多的外包工作生涯。有时候和现在的同事聊天,他们问:你当初在北京,为什么想到来上海呢?太多太多的原因,我承认我擅自选择北京,来上海这个决定,非常冲动,但是现在看来这个决定并不是多么愚蠢。
我就按照时间展开回忆吧!

那是2011年的4月15日,我们一行5人从学校踏上了北漂的列车。这是我北漂的开始,那晚的我在火车座位上度过,当时怀揣着对未来的命运,心底对北京很兴奋也很迷茫。第二天,我的初中同学一大早就来车站接我,我特感恩是我念了这么多年书,唯一的用处就是现在走到任何城市都有小伙伴陪我。 那是我北漂的开始。我开始工作了,终于不用家里每月寄钱给我了,我可以自己养活自己了。我其实一开始是很没有工作责任感的人,我刚加入的团队,由于我们团队boss即将离职,于是我作为一个刚进来的新人,没有安排导师,也没有分配任务,完全放养。我当时乐在其中,和另外2个同学一起在这个公司实习。他们没有我这么幸运,他们分在了A组每天分配了很多活,我没有活可干。转眼在公司待了2月,我B组Leader 终于离职了,而且公司也到了淡季,7月份公司不裁人以给员工放2月假不发薪水的方式逼很多人跳槽,我另外2个同学所在的B组老大决定不要他们,于是他们两个人失业了,而我却不知道为什么被留了下来。但是我想他们都走了,我留下来多没意思啊。(我很重感情 = =|)于是我和当时的团队负责人说我也不想做测试了,申请辞职。不顾Leader强烈挽留毅然决然的和小伙伴们一起失业。我当时真的没有想到这个决定导致的后果非常严重。

Read on →

JSPatch用法剖析

目录

  1. JSPatch介绍
  2. JSPatch VS Wax lua
  3. JSPatch的原理和核心
  4. JSPatch Extension机制
  5. JSPatch中的实现技巧总结
  6. 遇到的问题与解决方法

一、JSPatch介绍

用途

iOS产品开发之中常常会遇到这种情况: 新版本上线后发现有个严重的bug,可能会导致crash率激增,可能会使网络请求无法发出,这时能做的只是赶紧修复bug然后提交等待漫长的AppStore审核,再盼望用户快点升级,付出巨大的人力和时间成本,才能完成此次bug的修复。

JSPatch的出现解决了这样的问题,只需要在项目中引入极小的JSPatch引擎,就可以使用JavaScript语言调用Objective-C的原生接口,获得脚本语言的能力:动态更新iOS APP,替换项目原生代码、快速修复bug。

技术核心

JSPatch核心主要是JSBinding和Objective-C中的runtime技术。一方面,它采用Apple在iOS7中发布的JavaScriptCore.framework作为Javascript引擎解析JavaScript脚本,执行JavaSript代码并与Objective-C端的代码进行桥接。另一方面则是使用Objective-C runtime中的method swizzling的方式达到使用JavaScript脚本动态替换原有Objective-C方法的目的,并利用ForwardInvocation标准消息转发机制使得在JavaScript脚本中调用Objective-C的方法成为可能。

Read on →

编写高性能的Swift代码

下面这篇文档收集了一系列编写高性能 Swift 代码的要诀和技巧。文档的目标读者是编译器和标准库开发人员。 文档中的一些技巧可以帮助提升您的 Swift 程序质量,使您的代码不容易出错且可读性更好。显式地标记最终类和类协议是两个显而易见的例子。 然而文档中还有一些技巧是不符合规矩的,扭曲的,仅仅解决一些比编译器或语言的特殊的临时性需求。文档中的很多建议来自于多方面的权衡,例如:运行时、字节大小、代码可读性等等。

启用优化

第一个应该做的事情就是启用优化。Swift 提供了三种不同的优化级别:

  • -Onone: 这意味着正常的开发。它执行最小优化和保存所有调试信息。
  • -O: 这意味着对于大多数生产代码。编译器执行积极地优化,可以大大改变提交代码的类型和数量。调试信息将被省略但还是会有损害的。
  • -Ounchecked: 这是一个特殊的优化模式,它意味着特定的库或应用程序,这是以安全性来交换的。编译器将删除所有溢出检查以及一些隐式类型检查。这不是在通常情况下使用的,因为它可能会导致内存安全问题和整数溢出。如果你仔细审查你的代码,那么对整数溢出和类型转换来说是安全的。
  • Read on →

Swift 的 ABI

随着Swift的开源,苹果开发者迎来了新的开端。其实这个是我一直想要表达的,随着对Swift这个语言的深入了解,越发感觉到Swift的魅力。Swift是系统编程语言,现在C语言之所以能统治底层开发的最重要原因是C规范统一的ABI,使其能做到与汇编程序无缝衔接。而Swift的ABI兼容C(并不包括name mangling部分)。基于强大的llvm生成具体平台代码。不仅仅作为Objective-C的翻译。

通过开发Swift,了解到Swift文件的中间编译结果(介于Swift代码合llvm ir)是SIL。SIL我下一章着重介绍。这张暂时把焦点放在Swift的ABI。那么什么是ABI,你一定很陌生吧,那么对于API呢,你是不是明白了什么?

ABI的全称是Application Binary Interface。翻译过来就是应用二进制接口,描述了应用程序和操作系统或其他应用程序之间的低级接口。

ABI涵盖了各个细节: Read on →

这些年我的不足

如果把人生比作跑步的话,我们都在用自己的节奏和姿势在完成比赛。这些跑步的技巧可能是小时候从老师,朋友,家人那得来的。随着时间的流逝,我们习惯了这种跑步的技能,看见那些跑得快的,会羡慕;跑得慢的,会不屑;跑得别扭的,会当作笑料。但是自己跑得怎么样,却很少关心。为什么要跑这条道?为什么这么慢?为什么这么累?

我们很难做到客观,尤其是面对自己的时候,那些缺点、曾经犯的错会自动进入盲区,躲避意识的雷达。尽管如此,我还是找到了数量可观的不足,才发现,原来这么些年,我一直在以这么别扭、丑陋的姿势在跑步。

不够专注

Read on →