对象与内存
15.1指针和指针的值
对象只能通过指针访问,所以人们常用指向对象的指针来称呼该对象,例如有时候说“now是一个NSDate实例”。然而,一定要记住指针和它指向的对象是不同的,准确的说法应该是“now是一个指针变量,它保存了NSDate实例砸死内存中的地址”。
NSDate *currentTime =nil;
NSLog(@"currentTime's value is %p",currentTime);
初始指针为nil,currentTime指向0x0
NSDate *currentTime =[NSDate date];
NSLog(@"currentTime's value is %p",currentTime);
sleep(2);
currentTime =[NSDate date];
NSLog(@"currentTime's value is %p",currentTime);
现在currentTime指向了另一个实例,第一个NSDate实例我们已经丢失了,尽管它还在堆上。
如果要改变currentTime的值,但仍然希望访问第一个NSDate实例,就需要声明一个指针来存储第一个NSDate实例的地址。
NSDate *currentTime =[NSDate date];
NSLog(@"currentTime's value is %p",currentTime);
NSDate *startTime = currentTime;
sleep(2);
currentTime =[NSDate date];
NSLog(@"currentTime's value is %p",currentTime);
NSLog(@"the original object is %p",startTime);
15.2内存管理
栈是由有序的帧构成的。函数的帧会在函数结束后会自动释放,而堆里的对象不会自动释放。
管理堆很重要,因为程序占用的堆大小是有限的,而每个对象被创建后都会占用一定的堆内存。
没有指针指向第一个NSDate实例,从内存管理的角度来看,这个对象已经没用了。但是它占用了宝贵的堆内存,所以需要销毁
15.3ARC
自动销毁不被引用的对象的机制称为ARC。ARC是自动引用计数的简称,引用是指针的另外一种叫法。每个对象都会对自己的指针计数
当引用数为0的时候,就会认为不需要该对象了,程序会自动销毁该对象。如果项目开启了ARC,编译器会自动给项目添加代码来计数每个对象的引用计数
使用ARC,只能通过增加或减少对象的引用数来保留或者销毁对象,而只用当引用数为0时,他才回被销毁。
如果不再需要某个对象,则可以将指向它的指针设置为nil,活着销毁它的指针。来销毁对象。