天天看点

iOS内存管理学习笔记二

继续学习内存管理相关知识。

1、小小知识点

1>有关OC内存管理的方法并不包括在该语言中,而是包含在cocoa框架中,用于OS X,iOS的开发。

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

3>NSObject类的相关方法:

  • (instancetype)alloc ------创建
  • (instancetype)retain ------引用计数增加
  • (oneway void)release ------引用计数减少
  • (void)dealloc

    用图形表示如下:

    iOS内存管理学习笔记二
    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,好可怕,但是一定遇见过)。