美文网首页
15章:内存与对象

15章:内存与对象

作者: 帽子和五朵玫瑰 | 来源:发表于2018-05-22 10:07 被阅读0次

对象与内存

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,活着销毁它的指针。来销毁对象。

相关文章

网友评论

      本文标题:15章:内存与对象

      本文链接:https://www.haomeiwen.com/subject/gpfhjftx.html