Android 源代码上手指南 - Makefile语法

作者:JerryXia | 发表于 , 阅读 (18)
Android 源代码上手指南 - Makefile语法Mar 22, 2014
上一篇我们将到android build system, 讲了envsetup.sh和lunch, 在继续研究build过程之前有必要先讲讲Makefile的语法. android使用GNUMake 3.81(不支持其他版本!), 因此有许多GNU的特定语法, 和一般的Makefile长得很不一样. (为了叙述方便, 本文中凡是提到Makefile的地方, 均指GNU Makefile.) Makefile的基本语法是这样的:
TARGET: <DEPENDS><TAB>   instructions运行make TARGET命令时, 根据TARGET对应的DEPENDS来确定依赖关系, 根据修改时间来判断某个TARGET是否需要rebuild.如果需要, 则执行TARGET对应的instructions. 这就是Makefile的基本原理.
.PHONY targets在Makefile中, 有时会遇到标明为.PHONY的target, 它表示这个target只是一个名字, 不是一个文件. 例如:...阅读全文

[iOS] Storyboard 技巧总结

作者:JerryXia | 发表于 , 阅读 (19)
以前做iOS开发的时候主要还是用nib,最近几年Stroyboards变得比较流行。这几天集中学习了Storyboard的相关内容,总结下经验。
阻止segue有时候在点击一个按钮的时候希望进行一个check,满足条件才继续进行。在iOS6以后可以做到这一点:
- (BOOL)shouldPerformSegueWithIdentifier:(NSString *)identifier sender:(id)sender注意如果在代码中出发segue是不会自动调用这个函数的,需要你自己来调用。
unwind segueunwind segue用于”回退”一个segue。这个回退不一定是完全的go back。应用场景:
注册新用户向导,下一步,下一步,然后点击重置回到第一个Controller在一个tab中进行了操作,希望把当前的操作做完后切换到另一个tab的另一个controller.使用多个StroyboardStoryboard的一个重要缺点,也是我一直很嫌弃它也没怎么用它的原因在于,它把所有的ViewController放在一个文件里,这样有3个重大缺陷:
对重用很不利...阅读全文

[iOS] Blocks 中的递归

作者:JerryXia | 发表于 , 阅读 (11)
一点废话已经有一年多没有写blog了。最近一年人变的好懒,我觉得这样很不好,希望从现在开始可以坚持再写一写blog。最近又重新在看了很多ios的东西,觉得ios开发还是很有意思的,想自己动手做app,也许哪天能回归也说不定。
回归正题今天正好看到blocks,突然想到一个问题:在blocks里面要如何实现递归?我先按自己的想法试了下,用blocks来实现一个递归版本的阶乘函数fact:
int (^fact)(int) = ^int(int a) {if (a == 0) return 1;else return a * fact(a-1);};NSLog(@"fact(3)=%d", fact(3));运行以上代码后会crash,报错EXC_BAD_ACCESS,为何?原因是因为非__block变量会在block被创建的时候就直接捕获,而这个时候fact = xxx 这个赋值还没有发生,因此block中的fact变量会永久成为nil。
知道原因后,我们可以把fact声名为__block变量,这样该变量会被block放到堆上并进行retain操作,从而保持住值。下面来看修改后的版...阅读全文

一个swift编译器范型bug

作者:JerryXia | 发表于 , 阅读 (26)
才写了没几天swift就碰到了一个编译器bug,人品也是杠杠的。我是在写一个core data wrapper的时候碰到这个问题的:
class Wrapper {public func query<T:NSManagedObject>(entity: T.Type) -> QueryOperation<T> {let entityName:String = NSStringFromClass(entity).componentsSeparatedByString(".").last!return QueryOperation<T>(entityName: entityName, dq: self)}}我本来想这样调用:
Wrapper(...).query(MyCoreDataModel).filter(condition).all()这样是没问题的。 后来我又写了另一个函数:
class Wrapper {public func insertObject<T:NSManagedObject>(entity: T.Type, context: NSManagedObjectCo...阅读全文