2017.6.5 学习日记-第1条:了解Objective-C 语言的起源

《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

2017.6.5 学习日记-第1条:了解Objective-C 语言的起源_第1张图片
图1.1 上述文字所演示的内存布局


只有一个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);

你可能感兴趣的:(2017.6.5 学习日记-第1条:了解Objective-C 语言的起源)