iOS内存管理学习笔记二

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

继续学习内存管理相关知识。
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,好可怕,但是一定遇见过)。

目录
相关文章
|
5月前
【深入理解计算机系统】int 不是整数 | float 不是实数 | 内存引用错误的例子 | 学习笔记
【深入理解计算机系统】int 不是整数 | float 不是实数 | 内存引用错误的例子 | 学习笔记
36 0
|
9月前
|
存储 缓存 NoSQL
二十一、Linux性能优化实战学习笔记- 如何“快准狠”找到系统内存的问题?
已用内存、剩余内存、共享内存、可用内存、缓存和缓冲区的用量。
95 0
|
9月前
|
存储 缓存 BI
|
9月前
|
存储 缓存 算法
十五、Linux性能优化实战学习笔记 - Linux内存是怎么工作的
内存管理也是操作系统最核心的功能之一。内存主要用来存储系统和应用程序的指令、数据、缓存等
223 1
|
11月前
|
存储 并行计算 测试技术
【CUDA学习笔记】第五篇:内存以及案例解释(附案例代码下载方式)(二)
【CUDA学习笔记】第五篇:内存以及案例解释(附案例代码下载方式)(二)
125 0
【CUDA学习笔记】第五篇:内存以及案例解释(附案例代码下载方式)(二)
|
11月前
|
存储 并行计算 计算机视觉
【CUDA学习笔记】第五篇:内存以及案例解释(附案例代码下载方式)(一)
【CUDA学习笔记】第五篇:内存以及案例解释(附案例代码下载方式)(一)
190 0
|
12月前
【学习笔记之我要C】字符串+内存函数(下)
【学习笔记之我要C】字符串+内存函数(下)
57 0
|
12月前
【学习笔记之我要C】字符串+内存函数(上)
【学习笔记之我要C】字符串+内存函数
37 0
java202302java学习笔记第十天-数组的内存图1
java202302java学习笔记第十天-数组的内存图1
54 0
java202302java学习笔记第十天-数组的内存图1
java202302java学习笔记第六天-创建内存对象分析
java202302java学习笔记第六天-创建内存对象分析
65 0
java202302java学习笔记第六天-创建内存对象分析

热门文章

最新文章