您现在的位置是:首页 > 文章详情

iOS内存管理学习笔记二

日期:2017-06-06点击:288

继续学习内存管理相关知识。
1、小小知识点
1>有关OC内存管理的方法并不包括在该语言中,而是包含在cocoa框架中,用于OS X,iOS的开发。

2>cocoa框架中foundation框架类库中的NSObject类负责内存管理的职责。

3>NSObject类的相关方法:

  • (instancetype)alloc ------创建
  • (instancetype)retain ------引用计数增加
  • (oneway void)release ------引用计数减少
  • (void)dealloc
    用图形表示如下:


    img_dd3090e592b1a78f30f1c7b077d31505.png
    image.png

4>使用以下方法自己生成的对象,自己持有
+alloc
+new
+copy
+mutableCopy
例如:

NSObject * obj =[ [NSObject alloc]init]; 

使用alloc方法生成对象,并把指向该对象的指针赋值给了obj这个变量,现在这个对象的retainCount值等于1。
另外,使用new方法生成对象基本等同于[ [NSObject alloc]init]。
即:[NSObject new] --------- [[NSObject alloc]init];
题外话:[NSObject new]和 [[NSObject alloc]init]到底有什么区别呢?
我一直不相信他们没有任何区别,如果真是没有任何区别又为什么要写两个方法呢?
new方法的源码:

+new { id newObject = (*_alloc)((Class)self, 0); Class metaClass = self->isa; if (class_getVersion(metaClass) > 1) return [newObject init]; else return newObject; } 

而 alloc/init 像这样

+alloc { return (*_zoneAlloc)((Class)self, 0, malloc_default_zone()); } -init { return self; } 

概括来说,new和alloc/init在功能上几乎是一致的,分配内存并完成初始化。
差别在于,采用new的方式只能采用默认的init方法完成初始化,采用alloc的方式可以用其他定制的初始化方法。

5>非自己生成的对象,自己也能持有
id obj = [NSArray array];

obj可以取得对象的存在,但是并不持有该对象。
如果想持有该对象,需要主动调用retain方法,即:
[obj retain];
这样obj就持有了该对象。

6>自己持有的对象,如果不在需要了,就需要释放该对象,释放对象使用release方法。

//生成并持有该对象 id obj = [[NSObject alloc]init]; //释放该对象 [obj release]; 
//非自己生成对象 id obj = [NSArray array]; //持有对象 [obj retain]; //释放对象 [obj release]; 

注意:已经释放的对象是不可以再次访问的,如果访问了已经被释放的对象,就会造成崩溃。(wow,好可怕,但是一定遇见过)。

原文链接:https://yq.aliyun.com/articles/655345
关注公众号

低调大师中文资讯倾力打造互联网数据资讯、行业资源、电子商务、移动互联网、网络营销平台。

持续更新报道IT业界、互联网、市场资讯、驱动更新,是最及时权威的产业资讯及硬件资讯报道平台。

转载内容版权归作者及来源网站所有,本站原创内容转载请注明来源。

文章评论

共有0条评论来说两句吧...

文章二维码

扫描即可查看该文章

点击排行

推荐阅读

最新文章