转载请标明出处:
http://blog.csdn.net/hai_qing_xu_kong/article/details/53556243
本文出自:【顾林海的博客】
前言
Object-C的内存管理机制与java那种全自动的垃圾回收机制是不同的,它本质上还是c语言的手动管理方式,只不过稍微加了一些自动方法。
指针和指针的值
以下程序声明一个指向NSDate实例的变量:
#import <Foundation/Foundation.h>
int main(int argc, const char * argv[]) {
@autoreleasepool {
// insert code here...
NSDate *today=nil;
NSLog(@"%p",today);
}
return 0;
}
初始化指针变量为nil,程序输出0x0,这时在栈中的today变量值为0x0,而在堆上没有任何对象。
继续看下面实例:
#import <Foundation/Foundation.h>
int main(int argc, const char * argv[]) {
@autoreleasepool {
// insert code here...
NSDate *today=[NSDate date];
NSLog(@"%p",today);
}
return 0;
}
这时创建了一个NSDate实例,today指向这个实例,不再指向nil。堆上面保存着一个NSDate对象。
内存管理
栈是由有序的帧构成的,函数的帧在函数结束后会自动释放,而堆里的对象不会自动释放。因此管理堆很重要,程序占用堆大小是有限的。而每个对象被创建后都会占用一定的堆内存,如果系统内存不足,mac应用的运行效果就会变差,而ios应用就会崩溃。
当堆中的对象没有被引用,这时就应该销毁。
自动销毁不被引用的对象的机制称为ARC,ARC是自动引用计数的简称。每个对象都会对指向自己的指针进行计数,当引用计数为0时,就会认为不需要该对象了。如果项目开启了ARC,编译器会自动给项目添加代码来计算每个对象的引用数。
只要有一个指针指向对象,这个对象就会继续存在。因此调用free()函数来销毁对象是清理最干净的方法。如果不再需要某个对象,则可以将指向它的指针设置成nil,或者销毁它的指针。