- something变量指向分配在堆里的某块内存,其中含有一个NSString对象。后面创建的anotherthing指向同一块内存地址,并不拷贝对象本身,只是两个变量同时指向此对象。
当前“栈帧”里分配了两块内存,每块内存的大小都能容下一枚指针(32位架构计算机是4字节,64位计算机是8字节),每块内存的值都是一样,就是NSString实例的内存地址。
NSString *someString = @"The Thing";
NSString *anotherString = something;
- 分配在堆中的内存必须直接管理(MRC下手动管理,ARC下编译器自动生成管理内存的代码),而分配到栈上用于保存变量的内存则会在其栈帧弹出时自动清理。
- 在Objective-C中,有时会有不含*的变量:
CGRect frame = CGRectMake(0, 0, 100, 100);
CGRect本质上是C结构体:
struct CGRect {
CGPoint origin;
CGSize size;
};
typedef struct CGRect CGRect;
整套Foundation框架大量使用了这类结构体,主要是为了节约开销(分配以及释放堆内存堆开销)。