1. 稳定成熟的技术还是未成熟的新技术? 无论做出哪种选择,最终目的是产生利润。Both ends of the technology adoption curve might prove to be lucrative.
  2. 供应和需求 不要在价格上竞争,你承受不起。You can’t compete on price. In fact, you can’t afford to compete on price. 发现市场上的不平衡。Exploit market imbalances.
  3. 只会编程是不够的 仔细思考在哪个商业领域投入时间。Now is the time to think about business domains you invest your time in.
  4. 做团队中最差的 做乐队中最差的乐手。Be the worst guy in every band you’re in. 你身边的人会对你产生很大的影响,明智地选择你的圈子。The people around you affect your own performance. Choose your crowd wisely.
  5. 在思维上投资 没人给过我机会……?要学会抓住机遇!I haven’t been given the opportunity…? Seize the opportunity!
  6. 不要听从父母
  7. 做一名通才 通才很少,所以很珍贵。Generalists are rare… and, therefore, precious. 你的技术水平应该超越技术平台。Your skills should transcend technology platforms.
  8. 成为一名专家 很多人认为专攻某种技术就简单地意味着不知道其他技术。Too many of us seem to believe that specializing in something simply means not knowing about other things.
  9. 切忌孤注一掷 以特定技术厂商为中心的观点,缺乏远见。Vendor-centric views are typically myopic.
  10. 热爱它,不然就离开它 工作,因为你无法停止工作。Work because you couldn’t not work.
  11. 学习钓鱼 要主动问,不要等着别人来告诉你!Don’t wait to be told.Ask!
  12. 学习行业是如何运转的 只有了解了一个行业后,你才能创造性地有所建树。You can’t creatively help a business until you know how it works.
  13. 寻找良师 可以依赖别人,但要确保这个人是靠得住的。It’s OK to depend on someone. Just make sure it’s the right person.
  14. 做一名良师 想要弄明白自己是不是真正懂得某一知识,那就把它讲给其他人听。To find out whether you really know something, try teaching it to someone else. 做导师不会下岗。Mentors tend not to get laid off.
  15. 练习,练习,再练习 在极限处练习。Practice at your limits.
  16. 做事的方法 想要拥有自己的步骤,那就执行它。If you want to feel you own a process, help implement it.
  17. 站在巨人的肩膀上 从现有程序中得到领悟。Mine existing code for insights. 用现有程序来反思自己的程序。Use existing code to reflect on your own capabilities.
  18. 在工作中,将自己自动化
  19. 就是现在 就现在,我们能做些什么?What can we do? Right Now?
  20. 读心术 读心术用得好,人们就会信任你。The mind-reading trick, if done well, leads to people depending on you.
  21. 每日成绩 每天都有可汇报的成绩。Have an accomplishment to report every day.
  22. 别忘了你在为谁工作 好经理的职责不是“做替补”,即了解整个团队的工作应该怎么做,在出现难题的时候就自己上。好经理的职责应该是为团队设定优先级,确保团队具备完成工作的一切需要,保证团队保持干劲和工作效率,并促使团队最终顺利完成工作。整个团队的工作干得出色,就证明这个经理的工作非常优秀。 经理的成功,就是你们的成功。Your managers’ successes are your successes.
  23. 安分守己 要有雄心,但不必路人皆知。Be ambitious, but don’t wear it on your sleeve.
  24. 今天我能把工作做到多好? 你能为工作增添多少乐趣?How much more fun could you make your job?
  25. 你的价值是多少 问自己“今天实现自己的价值了么?”Ask, “Was I worth it today?”
  26. 一桶水中的鹅卵石 小心!别让成功冲昏了头脑。Beware of being blinded by your own success.
  27. 爱上维护 维护也可以成为自由和创造的沃土。Maintenance can be a place of freedom and creativity.
  28. 8小时激情燃烧 做项目像是马拉松,而不是全速短跑。Projects are marathons, not sprints.
  29. 学习如何失败 每个错误的音调离正确的音调不过一步之遥。Every wrong note is but one step away from a right one. 充满压力的时候是赢得忠诚的最好时机。Stressful times offer the best opportunities to build loyalty.
  30. 说“不” 为了避免失望而说“是”,就是在说谎。Saying “yes” to avoid disappointment is just lying.
  31. 不要恐慌 英雄从不恐慌。Heroes never panic.
  32. 说出来、行动、展示 状态报告可以帮助你推销自己。Status reports can help you market yourself.
  33. 不要忽视感觉 绩效考核永远都不会是客观的。Performance appraisals are never objective.
  34. 探险向导 客户害怕你。Your customers are afraid of you.
  35. 学会沟通,善于写作 你自己就是你要解释的内容。You are what you can explain.
  36. 到场 了解你的同事。Learn about your colleagues.
  37. 适当的言语 请用行业术语推销你的成就。Market your accomplishments in the language of your business.
  38. 改变世界 带着任务去上班,并确保别人知道你的任务。Have a mission. Make sure people know it.
  39. 创建自己的商标 你的名字就是你的商标。Your name is your brand. Google永远不会忘记。Google never forgets.
  40. 发布你编写的程序 人人都能使用Rails,但很少有人能开发出Rails。Anyone can use Rails. Few can say Rails contributor.
  41. 变为卓越的能力 展示或者让它死亡!Demo or die!
  42. 建立关系 恐惧感使我们无法接近专业人士。Fear gets between us and the pros.
  43. 已经过时的技术 你引以为傲的新技术已经过时了。Your shiny new skills are already obsolete.
  44. 你已经失去工作了 你不是你的工作。You are not your job.
  45. 没有终点的道路 不要关注结果,要关注做事情的过程。Focus on doing, not on being done.
  46. 给自己做一份蓝图
  47. 要注意观察市场变化 留意那些技术达人。Watch the alpha geeks.
  48. 镜子里的胖子 开发员们,要自我反省。Developer, review thyself.
  49. 南印度捉猴陷阱 价值僵固使你脆弱。Rigid values make you fragile.
  50. 避免瀑布型职业计划
  51. 每天都有进步
  52. 独立

引以自勉,摘自:http://esoftmobile.com/2014/03/22/the-passionate-programmer/

在 UIView 中有一个autoresizingMask的属性,它对应的是一个枚举的值(如下),属性的意思就是自动调整子控件与父控件中间的位置,宽高。

enum {
   UIViewAutoresizingNone                 = 0,
   UIViewAutoresizingFlexibleLeftMargin   = 1 << 0,
   UIViewAutoresizingFlexibleWidth        = 1 << 1,
   UIViewAutoresizingFlexibleRightMargin  = 1 << 2,
   UIViewAutoresizingFlexibleTopMargin    = 1 << 3,
   UIViewAutoresizingFlexibleHeight       = 1 << 4,
   UIViewAutoresizingFlexibleBottomMargin = 1 << 5
};
  • UIViewAutoresizingNone就是不自动调整。
  • UIViewAutoresizingFlexibleLeftMargin 自动调整与superView左边的距离,保证与superView右边的距离不变。
  • UIViewAutoresizingFlexibleRightMargin 自动调整与superView的右边距离,保证与superView左边的距离不变。
  • UIViewAutoresizingFlexibleTopMargin 自动调整与superView顶部的距离,保证与superView底部的距离不变。
  • UIViewAutoresizingFlexibleBottomMargin 自动调整与superView底部的距离,也就是说,与superView顶部的距离不变。
  • UIViewAutoresizingFlexibleWidth 自动调整自己的宽度,保证与superView左边和右边的距离不变。
  • UIViewAutoresizingFlexibleHeight 自动调整自己的高度,保证与superView顶部和底部的距离不变。
  • UIViewAutoresizingFlexibleLeftMargin |UIViewAutoresizingFlexibleRightMargin 自动调整与superView左边的距离,保证与左边的距离和右边的距离和原来距左边和右边的距离的比例不变。比如原来距离为20,30,调整后的距离应为68,102,即68/20=102/30。其它的组合类似。

例子:

 - (void)viewDidLoad
{
    [super viewDidLoad];
    self.view.backgroundColor = [UIColor whiteColor];

    UIView *view1 = [[UIView alloc] initWithFrame:CGRectMake(10.0f, 40.0f, 200.0f, 200.0f)];
    view1.backgroundColor = [UIColor greenColor];

    UIView *subView1 = [[UIView alloc] initWithFrame:CGRectMake(20.0f, 10.0f, 150.0f, 100.0f)];
    subView1.backgroundColor = [UIColor redColor];
    subView1.autoresizingMask = UIViewAutoresizingFlexibleLeftMargin | UIViewAutoresizingFlexibleRightMargin;

    [view1 addSubview:subView1];
    [self.view addSubview:view1];

    view1.frame = CGRectMake(10.0f, 40.0f, 320.0f, 200.0f);
    NSLog(@"subView1.frame:%@", NSStringFromCGRect(subView1.frame));
}

关于block的原理,唐巧已经在他的blog里面做了很详尽和专业的分析: http://blog.devtang.com/blog/2013/07/28/a-look-inside-blocks/
一言以蔽之:闭包是一个函数(或指向函数的指针),再加上该函数执行的外部的上下文变量(有时候也称作自由变量)。block是Objective-C语言对于闭包的实现。

我们大多数用block的时候,一般只会用到block带确定个参数的情况,比如:

void (^callback)(int);
void (^callback)(NSDate *);

如果现在要实现block的参数个数不定的情况,该怎么实现呢?记得我们用UIAlertView类的时候,有个初始化方法为:

- (id)initWithTitle:(NSString *)title message:(NSString *)message delegate:(id)delegate cancelButtonTitle:(NSString *)cancelButtonTitle otherButtonTitles:(NSString *)otherButtonTitles, ...

注意到没有,otherButtonTitles后面的3个省略号。对了,这就是C语言实现参数不定的方法。我们把它移植到block中来,比如:

void (^callback)(NSDate *, ...)

问题又来了,怎么获得NSDate后面的参数呢。C语言提供了var_start,var_end,var_arg 3个宏可以用来获取NSDate后面的参数。关于var_start,var_end,var_arg的详细信息,可以参考:http://www.cnblogs.com/hanyonglu/archive/2011/05/07/2039916.html
有一点需要注意,函数参数是以数据结构栈的形式存取,从右至左入栈。参数存放在内存的栈中,在执行函数的时候,从最后一个开始入栈。因此栈底高地址,栈顶低地址,

比如我们有一个类TestView,在点击这个类的时候,触发一个block:

TestView.h

typedef void(^CallbackBlock)(NSObject *object, ...);

@interface TestView : UIView

@property (nonatomic, copy) CallbackBlock callbackBlock;

@end

TestView.m

#import "TestView.h"

@implementation TestView

- (id)initWithFrame:(CGRect)frame
{
    self = [super initWithFrame:frame];
    if (self) {

    }

    return self;
}

- (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event
{
    if(_callbackBlock) {
        _callbackBlock(@"1", @"2", [NSDate date], [NSArray arrayWithObjects:@"1", nil], nil);
    }
}
@end

注意,参数列表的末尾一定要以nil结束,否则会报野指针的异常。

ViewController.h

#import <UIKit/UIKit.h>

#import "TestView.h"

@interface ViewController : UIViewController

@end

ViewController.m

#import "ViewController.h"

@interface ViewController ()

@end

@implementation ViewController

- (void)viewDidLoad
{
    [super viewDidLoad];
    self.view.backgroundColor = [UIColor whiteColor];

    TestView *testView = [[TestView alloc] initWithFrame:CGRectMake(10, 100, 300, 100)];
    testView.backgroundColor = [UIColor orangeColor];
    [self.view addSubview:testView];
    testView.callbackBlock = ^(NSObject *obj1, ...) {

        va_list ap;
        NSString *str_ = nil;

        va_start(ap, obj1);
        str_ = va_arg(ap, id);

        while(str_ != nil) {
            NSLog(@"str_:%@", str_);
            str_ = va_arg(ap, NSString *);
        }
        va_end(ap);
    };
}

以后在工程中,只用定义一个block就可以了:

typedef void(^CallbackBlock)(NSObject *object, ...);

中文blog

英文blog