《Effective Objective-C 2.0 编写高质量iOS与OS X的52个有效方法》读书总结
第一章 熟悉的Objective-C
第1条:了解Objective-C 语言的起源
Objective-C语言由Smalltalk演化而来,后者是消息型语言的鼻祖
Messaging Structure:消息结构
语法:
Object *obj = [Object new];
[obj performWith:parameter1 and: parameter2];
Function Calling:函数调用
语法:
Object *obj = new Object;
obj -> perform(parameter1, parameter2);
关键区别在于:前者运行时执行发代码由运行环境来决定,后者则由编译器决定。
Objective-C 是 C 的“超集”(superset),C语言中所有功能在编写Objective-C代码时依然适用。
C语言 内存模型(memory model)
Objective-C 引用计数(reference counting)
Objective-C 中指针是用来表示对象的, 对象所占内存总是分配在堆控件(heap space), 而不在栈(stack)上。 someStr 变量指向分配在堆里的某块内存,其中包含一个NSString对象。若再创建一个变量,令其指向同一地址,并不拷贝该对象, 只是会有两个变量同时指向此对象, 如图1.1。
NSString *someStr = @"The String";
NSString *anotherStr = someStr;
NSString someStr; //error�:interface type cannot be statically allocated
只有一个NSString实例,有两个变量指向此实例,两个变量都是NSString* 型,这说明当前栈帧里分配了两块内存,每块内存的大小均可容下一枚指针(32位下为4字节,64位下为8字节)。
分配在堆中的内存必须直接管理,而分配在栈上用于保存变量的内存则会在其栈帧弹出式自动清理。
Objective-C将堆内存抽象出来,不需要malloc及free来分配或释放对象所占的内存,这种内存管理架构叫做引用计数
还有一些不含*的变量,它们可能会使用栈空间(stack space),这里保存的不是Objective-C对象。
如:CGRect是C的结构体,其定义是
struct CGRect {
CGPoint origin;
CGSize size;
};
typedef struct CGRect CGRect;
整个系统框架都在使用这种结构体,若使用Objective-C对象的话还需要额外开销,如分配及释放内存,性能会受影响。
如果只需保存int、float、double、char等非对象类型(non-object type),通常使用CGRect这种结构体就可以了。
CGRect frame = CGRectInset([cell bounds], 10, 10);