(翻译)Property Values

现场教学的一部分乐趣是应付问题和独立思考。在我展示了一些在类中广泛使用的 @property 代码,其中一个学生问到"@property 后面繁琐的字段都是什么?我已经使用了 retain, assign 和 nonatomic,但我真的不知道它们真正是干什么用的。"(如果你仅仅只是想要一份快速参考,文章最后有所有的 @property 属性。)

对于许多 Objective-C 程序员来说,@property 就像一个神奇的护身符。添加一些像这样的代码给你的狗对象一个名字:

1
@property (copy, nonatomic) NSString *puppyName;

把它放到 Xcode 的代码片断库中,当需要它时粘贴进来然后编辑它。

@property 是一个属性声明,它有两个目的:声明一个或两个方法,当你使用这些方法时简洁地描述它们的运行时语义。

我声明

@property 声明是声明访问器方法的简写。这些方法让你从对象获取值(嘿 puppy,你叫什么名字?)或者改变值(puppy 欢迎回家,现在你的名字是 Rumperlstiltskin)。下面就是类声明中的 property 声明:

1
2
3
@interface Puppy: NSObject
@property NSString *puppyName;
@end
继续阅读

(翻译)Tips and Techniques for Framework Developers

Initialization

Class initialization

initialize 类方法是一个一次性,懒散的执行一些代码的地方,它会在类的其他方法被调用之前调用。最典型的应用是设置类的版本号。 动态系统给继承链上每一个类发送initialize方法,即使方法没有实现。因此它可能会被调用多次(例如,一个子类没有实现它。)。通常我们只想初始化代码被执行一次。一种实现的方法是使用dispatch_once();

1
2
3
4
5
6
7
8
9
10
11
+ (void)initialize {

static dispatch_once_t onceToken = 0;

dispatch_once(&onceToken, ^{

    // the initializing code

}

}

Note:因为动态系统发送initialize给每一个类,所以它很可能会在子类的上下文中调用—如果子类没有实现initialize,会调用父类的实现。如果在相关类的上下文中有特殊的初始化需求,我们可以进行如下操作而不仅仅是使用dispatch_once();

1
2
3
4
5
if (self == [NSFoo class]) {

    // the initializing code

}
继续阅读

Objective-C Class and Object

Objective-C是一门面向对象的编程语言,既然是面向对象,那我们就有必要对它的对象作进一步的理解,而且它的很多特性与这也大有关系。

1.Class

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
/// An opaque type that represents an Objective-C class.
typedef struct objc_class *Class;

struct objc_class {
Class isa  OBJC_ISA_AVAILABILITY;

#if !__OBJC2__
Class super_class                                          OBJC2_UNAVAILABLE;
const char *name                                             OBJC2_UNAVAILABLE;
long version                                               OBJC2_UNAVAILABLE;
long info                                                  OBJC2_UNAVAILABLE;
long instance_size                                         OBJC2_UNAVAILABLE;
struct objc_ivar_list *ivars                              OBJC2_UNAVAILABLE;
struct objc_method_list **methodLists                     OBJC2_UNAVAILABLE;
struct objc_cache *cache                                  OBJC2_UNAVAILABLE;
struct objc_protocol_list *protocols                      OBJC2_UNAVAILABLE;
#endif

} OBJC2_UNAVAILABLE;
继续阅读