0%

请看下面几行代码

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
// MyObject.h
@interface MyObject : NSObject {
NSString *name;
}
@property (nonatomic, retain) NSString *name;
@end

// MyObject.m
@implementation
@synthesize name;
@end

// MyObject.h
@interface MyObject : NSObject {
}
@property (nonatomic, retain) NSString *name;
@end

第一个 interface 里面声明了一个 instance variable 名为 name,然后定义其为 property。 第二个 interface 里面直接定义了一个 property 名为 name。

第二个忘了声明 instance variable 吗?

如果你使用的 Objective-C Runtime 版本高于 ios 3.x 或者高于 64bit Snow Leopard,那么第二个方法是正确的。

Read more »

长久以来,我都有这样一个观念,比如 pack(4),就代表着所有数据都是以 4 字节对齐的,直到我有了 64 位机,并且看到下面这个例子:

1
2
3
4
5
6
7
8
9
10
11
struct One {
double d;
char c;
int i;
};

struct Two {
char c;
double d;
int i;
};

如果按 4 字节对齐的话,按我的观点,结构体中每一个成员都应该以 4 字节对齐,那么两个都是 4+8+4=16, 结果是对的。

那么如果按 8 字节对齐的话,结果是不是应该是 8+8+8=24?

可是错了。

Read more »

Hibernate 的创建者 Gavin King 发明的新语言,Ceylon,基于 Java 虚拟机,并且认为这个语言是 Java Killer,完全针对他对 Java 不爽的地方改进的。

下面是当时的 slides,第一个是初衷和新语言设计,第二个是 Ceylon 的类型系统,包括闭包,泛型等。

因为 QCon 是 Oracle 等公司赞助的,一身型男打扮的 Gavin King,身后是大大的 Oracle Logo,然后型男不停吐槽 Java,真是别有一番滋味。

Gavin King 觉得用动作语言实现 DSL (Domain Specific Language) 很危险,会不知道什么该做,什么不该做,因为没有限制,比如类型等。

被问道和 Scala 的对比时,他说他不怎么了解,但认为 Scala 可读性很差,另外他觉得没有 IDE 来做 refactoring 是不可接受的。

Read more »

Eric Evans - Domain-Driven Design Strategies Dealing with Legacy System

首先从两个耦合关系很大的遗留系统开始,当我们需要增加新功能时,往往涉及到两个遗留系统的更改,那势必会又增加这两个系统之间的耦合关系。

当问题多到一定程度,遗留系统之间藕断丝连的关系层出不穷,每一个新功能的添加都变得像噩梦,便有念头说要不干脆重写整个系统。

假设整个新系统是一个金字塔结构,新功能的添加相当于塔顶部分,跟业务功能关系不大的基础设施则相当于塔底部分,然后中间层是业务逻辑。

我们计划第一年,先完成基础设施功能的实现,因为它跟业务无关,所以遗留系统仍然继续维护;第二年,完成业务逻辑层的实现,这一层,将会慢慢的将旧的遗留系统中的功能模块迁移到新系统中;第三年,添加新功能到塔顶。

Read more »

@robinlu 的 High Quality iOS Development.

内存管理中的引用计数,Ownership 的概念,以及 Autorelease 的使用,这些都快被讲烂了。

但里面提到的 implicit ownership 以前没怎么注意过:

NSTimer, Delayed performance of selector, Thread, IBOutlet

另外提到的 Circular Reference,使用引用计数来进行内存管理很容易出现环引用的场景,比如有一个父视图包含一个子视图,则 retain 子视图,然而子视图又需要知道自己的父视图是谁,则需要 retain 主视图,于是就出现了循环,这样因为相互依赖,内存始终是得不到释放的。

Read more »

上周末在北京参加了 QCon 会议,是自己第一次参加,学到了很多东西,大大开拓了眼界,一直忙没来的及总结,这篇以及后面的几篇都是对这次会议上自己感兴趣的东西的总结,在这里分享一下。

上海贝尔的敏捷转型之旅

讲了 5 个转型故事,可能因为我也是处于相似的环境下,听得好累 :-)

  • 自上而下改革,领导更替,组织调整,意见分歧,传言惑众;
  • 高速中换轮胎,"黑暗"力量卷土重来,"敏捷不搞了";
  • 大师一席话胜读 10 年书,大师的话真的这么重要吗? 答案是的确重要;
  • 祝福的人少,挑刺的人多,自以为是的咨询师…

整个 session 最让我印象深刻的是,说中间换了个领导,然后让人觉得敏捷好像不搞了,然后自己怎么怎么跟领导谈,让领导支持,甚至是公司有的团队使用了 agile,却不让他写到案例中,要悄悄搞。

Read more »

align-regexp

相必大家都用过 C-M-\,一般都能满足需要,可是有时候需要按一行中的某些字符对齐,比如一些变态的语言或者编程规范规定赋值语句需要按 "=" 对齐,那怎么办?

align-regexp 使用起来只需要选中需要对齐的 region,然后执行,输入需要匹配的正则表达式即可。

比如如下代码:

1
2
3
int var = 2;
int variable_is_kinda_long = 3;
int var_is_less_long = 4;
Read more »

StackOverflow 上有人问除了 HIG 外使用 Objective-C 以及 Cocoa 还有什么好的工程实践,果然是抛砖引玉,很多好的 practices 和 tips 一一跃然纸上,摘抄一些:

1> 使用 properties,不用 "_" 前缀。

2> 把 private 方法的定义移到 .m 文件,如下:

1
2
3
4
5
6
7
8
#import "MyClass.h"

@interface MyClass ()
- (void) someMethod
- (void) someOtherMethod
@end

@implementation MyClass

Objective-C 的方法没有像 Java 那样的 private 或者 public 属性,如果需要设置方法为 private,一般采用 category 来对方法进行隐藏。

Read more »