发布于 

摘抄Effective Objective-C 2.0 (1)

Objective-C的对象总是使用指针的原因

因为对象所占用的内存总是分配在“堆空间 (heap space) ”中,而绝对不会分配在“栈(stack)上。不能在栈中分配Objective-C对象:

NSString stackString;

// error: interface type cannot be statically allocated

Objective-C将堆内存管理抽象出来了。不需要用mallocfree来分配或释放对象所占内存。Objective-C运行期环境把这部分工作抽象为一套内存管理架构,名叫“引用计数”

Objective-C代码中,有时会遇到定义里不含*的变量,它们可能会使用“栈空间”这些变量所保存的不是Objective对象。比如CoreGraphics框架中的CGRect。这是一个结构体。与创建结构体相比,创建对象还需要额外开销,例如分配以及释放堆内存等。


向前声明(forward declaring**)**” 在编译一个使用了EOCPerson类等文件时,不需要知道EOCEmployer类等全部细节,只需要知道有一个类名叫EOCEmployer就好。


委托协议就不用单独写一个头文件了在那种情况下,协议只有与接受协议委托等类放在一起定义才有意义。此时最好能在实现文件中声明此类实现了该委托协议,并把这段实现代码放在“class-continuation分类)(class-continuation category)


多用字面量语法,少用与之等价的方法。

其中:

arrayWIthObjects:”方法会依次处理各个参数,直到发现nil为止。如果在插入数组的时候,存在nil。方法会提前终止。

多用类型常量,少用#define预处理指令

static const NSTimeInterval kAnimationDuration = 0.3;

常用的命名方法是:若常量局限于某“编译单元”(translation unit,也就是“实现文件”,implementation file)之内,则在前面加字母k

若常量在类之外可见,则通常以类名为前缀。变量一定要同时用static const来声明。


编译器每收到一个编译单元,就会输出一份“目标文件”(object file)。Objective-C的语境下,“编译单元”一词通常指每个类的实现文件(以.m为后缀名)。假若声明此变量时不加static,则编译器会为它创建一个“外部符号”(external symbol)。


  全局符号表(global symbol table)中,以便可以在定义该常量的编译单元外使用。因此,其定义方式与上例演示的static const有所不同。应该这样子定义

// In the header file

extern NSString *const EOCStringConstant;

// In the implementation file

NSString *const EOCStringConstant = @“VALUE”;

编译器看到头文件中的extern关键字,就能明白如何在引入此头文件的代码中处理该常量了。这个关键字是要告诉编译器,在全局符号表中将会有一个名叫EOCStringConstant的符号。也就是说,编译器无须查看其定义,即允许代码使用此常量。因为它真的,当链接成二进制文件之后,肯定能找到这个常量。

注意const修饰符在常量类型中的位置。常量定义应从右至左解读,所以在本例中,EOCStringConstant就是“一个常量,而这个常量是指针,指向NSString对象”。


Foundation框架中定义了一些辅助的宏,用这些宏来定义枚举类型时,也可以指定用于保存枚举值的底层数据类型。

typedef NS_ENUM(NSUInteger, EOCConnectionState) {

   EOCConectionStateDisconnected,

   EOCConectionStateConnecting,

   EOCConnectionStateConnected,

};
typedf NS_OPTIONS(NSUInteger, EOCPermittedDirection) {

  EOCPermittedDirectionUp       = 1 << 0,

  EOCPermittedDirectionDown  = 1 << 1,

  EOCPermittedDirectionLeft     = 1 << 2,

  EOCPermittedDirectionRight   = 1 << 3,

};

本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议,转载请注明出处。

本站由 @shyiuanchen 创建,使用 Stellar 作为主题。