好久没有更新博客=。=

周末才发现博客的个人简介图片都挂了。。。http://tutuge.me/about/
才想起来好久没有更新了=。=
TODO List上攒了一堆的“要写、要分享”的内容
但是迟迟没有动手
一直以来都用“工作太忙、没想好、积累不够”搪塞自己

哎。。。
其实还是太懒
自从工作了以后
Geek精神感觉就被放入了牢笼
慢慢陷入了舒适区
虽然工作上一直很顺利
但是内心总有不安与悸动

生活的意义是什么?
工作的目标是什么?
从小只想着“星辰大海”
现在只盼望“升职加薪”

唯有英国诗人狄兰·托马斯的《不要温和地走进那个良夜》在脑海里回响:

Do not go gentle into that good night,
Old age should burn and rave at close of day;
Rage, rage against the dying of the light.

Interstellar

阿里巴巴国际无线技术部 - 招人啦~求iOS、Android、Java

阿里巴巴(中国)网络技术有限公司

招人啦~求iOS、Android、Java

大量招人啊~~~真实信息绝无有假啊~~~我不是HR不是猎头,我是开发啊~~~我就是土土哥啊~~~

转-阿里巴巴国际无线技术部 - 在这里遇见最好的自己

转自

给自己部门的软文!
阿里巴巴国际无线技术部 - 在这里遇见最好的自己

我们做什么

阿里巴巴国际无线技术部背靠阿里巴巴集团和阿里巴巴国际站,阿里巴巴国际站是全球领先的跨境B2B贸易服务平台,服务全世界数以千万计的采购商和供应商,阿里巴巴国际站(www.alibaba.com)帮助中小企业拓展国际贸易的出口营销推广服务,专注服务于全球中小微企业,在平台上,通过向海外买家展示、推广供应商的企业和产品,进而获得贸易商机和订单,买卖双方可以在线更高效地找到适合的彼此,并更快更安心地达成交易,是出口企业拓展国际贸易的首选跨境贸易平台。

阿里巴巴国际站技术致力于打造一站式eWTP全球国际B类贸易服务平台解决方案。近年来,随着智能手机的普及无线的趋势已经锐不可当。阿里巴巴国际无线技术部不仅是站在阿里巴巴集团和阿里巴巴国际站两个巨人的肩上,更是站在无线时代的浪潮之上。来吧少年,一起为全球中小企业服务!

反编译分析并模拟实现methodSignatureForSelector方法

前言

最近跟同事讨论了有关methodSignatureForSelector:的问题,大概如下:

  1. 一个ProtocolA声明了一个实例方法funcA,然后一个类ClassA声明实现这个ProtocolA,但是并没有实现方法funcA,对ClassA的实例调用methodSignatureForSelector:@selector(funcA)能否返回正确的signature?
  2. 一个类ClassB,在@interface声明了实例方法funcB,但是没有实现funcB,对ClassB的实例调用methodSignatureForSelector:@selector(funcB),能否返回正确的signature?

写个Demo验证了下,结果非常有意思,不由得好奇起来,所以深入研究了下methodSignatureForSelector:的实现,然后自己模拟实现出来。

Github地址:TTGRemakeMethodSignatureForSelector

详细的研究过程如下:

反编译分析Xcode8的Bug, release下连续两次调用有二级指针参数的空方法会Crash

更新

  • 在最新的Xcode 9 Beta版本中,此Bug已被苹果修复:Bug ID 30530580: Crash on “Release” Build Configuration scheme setting for Out Parameters code

二级指针

二级指针,也叫指针的指针,或者Out Parameters,可以用来改变一个指针的地址值,由于在Objective-C里面方法、函数不支持返回多个值,所以经常用二级指针实现这个功能,比如NSFileManager- (BOOL)removeItemAtURL:(NSURL *)URL error:(NSError **)error方法,就可以让方法在内部创建error后传出。

有趣的Autolayout示例5-Masonry实现

前言

第五篇来了!
还是3个小例子,仍然是主要部分用Masonry手写代码实现,其它的约束在storyboard里面直接拖拽搭建。三个例子分别是:

  1. UITableViewCell中多个变高的Label
  2. StairView自定义View的intrinsicContentSize,并支持在UITableViewCell中自动计算高度
  3. 给同一个属性添加多重约束,实现复杂关系

前四篇:

Github地址:
https://github.com/zekunyan/AutolayoutExampleWithMasonry

在对象dealloc的后期执行Task-开源库TTGDeallocTaskHelper

前言

最近更新了下以前写的TTGDeallocTaskHelper库,功能非常简单,就是在不改变原有代码的情况下,不用Runtime的Method Swizzling给任意对象添加任务Block,在对象dealloc的后期执行Block。使用时:

1
2
3
4
// 给object对象添加dealloc后期要执行的任务Block
[object ttg_addDeallocTask:^(__unsafe_unretained id target, NSUInteger identifier) {
// 执行任务
}];

Github地址:https://github.com/zekunyan/TTGDeallocTaskHelper

一张图说明原理:

总体结构

库的详细原理、限制、注意事项,为什么说“后期”执行,将在下文给出。

用QuartzCode快速实现一个收藏动画

前言

“工欲善其事,必先利其器”,iOS的Core Animation非常强大,可以做出非常炫酷的动画,但是实际写起来还是比较麻烦,代码不直观,需要反复的改参数、Build、运行,所以诞生了各种动画制作工具,本文就以其中比较有名的QuartzCode为例,快速实现一个收藏功能的星星动画,最终的效果如下:

GitHub地址:https://github.com/zekunyan/QuartzCodeExample-StarAimation

开源项目-拼图验证控件TTGPuzzleVerify的实现

前言

最近抽空写了个拼图验证控件,用户可以通过水平、垂直,或者直接拖动拼图块,完成拼图图案,来完成验证。拼图块的形状可以自定义,默认提供了经典的拼图形状、圆形、正方形,整个拼图的图案也是支持从图片生成的。

CocoaPods: pod "TTGPuzzleVerify"
Github: https://github.com/zekunyan/TTGPuzzleVerify

接下来,说说TTGPuzzleVerify的整体设计思路和实现原理。

Swift开源Mac App - BingWallPaper

更新

  • 2016-09-05: 新版0.3增加子Menu,整理选项;增加“History Wallpapers”打开历史图片文件夹;增加“Launch at startup”开机启动。
  • 2016-09-03: 新版0.2.0!增加“Auto Update”选项;增加“Random”随机选择设置壁纸;修复自动更新不准的Bug。

Banner

极简的壁纸Mac App,每天自动下载最新微软Bing的每日壁纸并设置为桌面背景。

ScreenShot1

Github: https://github.com/zekunyan/TTGBingWallPaper

有趣的Autolayout示例4-Masonry实现

前言

第四篇来了。
还是3个小例子,仍然是主要部分用Masonry手写代码实现,其它的约束在storyboard里面直接拖拽搭建。
三个例子分别是:

  1. 用约束优先级保证可移动View的内容可见
  2. Autolayout的约束=控件间位置关系的“绑定”
  3. 利用layoutIfNeeded控制约束的生效时机

前三篇:

Github地址:
https://github.com/zekunyan/AutolayoutExampleWithMasonry

Gif示例

翻译-为什么objc_msgSend必须用汇编实现

译者前言

总是看到有人说用汇编实现objc_msgSend是为了速度快,当然这个不可否认。但是难道没有别的原因?于是就看到了这篇文章,遂翻译之!=。=

我自己的理解就是,用汇编实现,是为了应对不同的“Calling convention”,把函数调用前的栈和寄存器的参数、状态设置,交给编译器去处理。
先看看原文吧。

原作者: Ari Grant
原文链接: Why objc_msgSend Must be Written in Assembly

API返回结果设计经验与总结

前言

RESTful API的设计已经很成熟了,大家也都比较认可。本文也不再过多介绍RESTful API相关的知识,而是针对JSON型API的返回结果设计,总结下自己的经验。

结构

先来看看返回结果的结构示例:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
{
data : { // 请求数据,对象或数组均可
user_id: 123,
user_name: "tutuge",
user_avatar_url: "http://tutuge.me/avatar.jpg"
...
},
msg : "done", // 请求状态描述,调试用
code: 1001, // 业务自定义状态码
extra : { // 全局附加数据,字段、内容不定
type: 1,
desc: "签到成功!"
}
}

总结一些iOS项目中组织代码的方法

前言

总结一些组织代码的方法,大到各个子项目模块之间,小到单个文件内部,涉及到了CocoaPods私有库、Carthage构建私有Framework、项目内Group和文件夹、类内用Category组织、文件内的#pragam mark、// MARK -。虽然有些老生常谈,就当是重新梳理一遍吧=。=。

对组件化与模块化的思考与总结

前言

前段时间反复研读了蘑菇街 App 的组件化之路蘑菇街 App 的组件化之路·续iOS应用架构谈 组件化方案,然后又找到了其它一些研究组件化、模块化方案的文章,但是总觉得差点什么,所以还是决定从头开始思考。文章的标题起的好宽泛,感觉给自己挖了个深坑-。-,其实只是自己对组件化、模块化的一些看法、总结。

开源项目-TTGTagCollectionView

更新

  • 2017-02-27: 增加两种Alignment布局类型;增加点击前的回调判断;增加选中Tag上限
  • 2016-12-25: 不再依赖UICollectionView,减少了位置刷新次数,提高性能;增加了alignment属性,可以靠左中右排列
  • 2016-10-29: 增加Tag的阴影和ContentInset的设置,更新了Demo
  • 2016-10-17: 增加了水平滑动;Autolayout适配;UITableViewCell例子等
  • 2016-02-18: 修复了超长标签导致排版错误的Bug

前言

这段时间做项目的时候,总是需要显示一些“标签”样式的内容,但是又找不到用的顺手的库,所以琢磨了几天,自己实现了出来,就有了这个库:TTGTagCollectionView。如果只需要显示文字标签的话,直接使用TTGTextTagCollectionView,需要自己定义标签的话,就用TTGTagCollectionView,效果如下:

ScreenShot

支持五种布局排版:

Alignment

CocoaPods: pod "TTGTagCollectionView"
Carthage: github "zekunyan/TTGTagCollectionView"

Github地址: https://github.com/zekunyan/TTGTagCollectionView

有趣的Autolayout示例3-Masonry实现

更新

  • 2016-06-02: 感谢我不是蜡笔小新但是我有小白,发现了Case 2的最后两个cell展开动画问题,原来是tableView的estimatedRowHeight会跟展开动画冲突的缘故。
  • 2015-12-23: 感谢XVXVXXX的PR,Case 1不再需要Fake Header View,直接用contentInset就好~
  • 2015-12-17:Case3的等间距,用UIStackView实现最优雅,但是无奈只有iOS9以上支持。兼容方案如OAStackView也可以,但是在UITableViewCell里面用,或者需要频繁的增减内部View的数量时,性能损耗有点厉害,会卡。所以,还是要看需求=。=

前言

第三篇来了。
依然是3个小例子,主要部分用Masonry手写代码实现,其它的约束在storyboard里面直接拖拽搭建。
至于为啥不用VFL,主要是因为它的“描述性”的写法很容易出错,没有补全、不好调试,写起来没有“代码”的感觉=。=。当然,这个仁者见仁智者见智~
三个例子分别是:Parallax Header动态变高度的UITableViewCell,以及两种方式实现等间距。原理其实都很简单,例子也都是平时积累起来的。

前两篇:

Github地址:
https://github.com/zekunyan/AutolayoutExampleWithMasonry

Gif示例

Swift写的库-TTGSnackbar

更新

  • 2016-12-25: 增加多行文本的支持,增加阴影
  • 2016-10-20: 增加ContentInset,也就是Padding的属性;增加自定义内容View; 版本1.3.0
  • 2016-10-17: 支持Swift3;增加的顶部Top位置动画;增加同时两个Action按钮;增加带图片icon显示
  • 2016-03-25: 版本更新到了0.5.1,补充些说明、示例

TTGSnackbar

用Swift写了个简单的控件库:TTGSnackbar,模仿Android的Snackbar。目前更新到了版本1.3.0。支持多种动画,增强了自定义。

Github: https://github.com/zekunyan/TTGSnackbar

Screenshot

Gif

Screenshot

当前网速较慢或者你使用的浏览器不支持博客特定功能,请尝试刷新或换用Chrome、Firefox等现代浏览器