15章:内存与对象

对象与内存

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

©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 在那物质生活匮乏的七十年代初; 在那一个偏远落后的小山村;在那一个有着微薄收入的大家庭,是没有精彩的故事书可...
    xm雪梅阅读 634评论 0 0
  • 作为一个资深路痴,我只知道上下和前后左右,拜托,别找你时,告诉我你在东南还是西北。因为这压根就像对一只迷路的兔子在...
    我是甘棠阅读 626评论 2 4
  • 这些初中生与我那个年代不同,也许是与我更不同,他们是出生在北京这个大都市,接受的是最好的教育,最先进的理念,而我出...
    相相阅读 380评论 0 0
  • 学习runtime时查阅了很多相关博客,大多数讲的都是概念性的理解,对runtime具体运用介绍的非常少。这里我总...
    caixin阅读 275评论 0 1
  • 编程语言 Swift Objective-C C++/C JavaScript 操作系统 Mac OSX iOS ...
    左左4143阅读 797评论 0 0