OC 内存管理

1.栈、堆

1.栈内存是由系统管理的

2.栈是用来存放局部变量

3.当代码执行到定义哪一行为这个局部变量分配存储空间

4.当程序执行到定义变量的代码块结束的时候,就会回收这个变量

堆:

1,堆内存是由程序员管理(动态存储区)

2. OC中的对象时在堆内存中

2.引用计数器:

OC中每一个对象,都有4个字节存储空间,用来存放引用计数的值

作用:

引用计数器的值,就是当前有多少个人在使用对象

当引用计数器为0时候,系统会立即回收这个对象

在OC中判断一个对象是否被回收的唯一依据:就是看这个对象的引用计数器是否为0

如何操作引用计数器:

1.当新创建一个对象的时候,他引用计数器为1(new,alloc,copy,multableCopy)

2.当给一个对象发送retain消息,它的引用计数器+1

3.当给一个对象发送release消息,它的引用计算器-1

当一个对象的引用计数器为0时候,系统就会调用dealloc

作用:1.验证对象是否被回收了

2.释放对象自己的资源

当一个对象的引用计数器为0的时候,这个对象就是僵尸对象

3.野指针:

当一个对象指针指向一个僵尸对象的时候,那么这个指针就是野指针

当定义一个指针,而这个指针没有进行初始化

操作野指针是非常危险的:1.程序崩溃了 2.数据错误

4.内存管理是来管理“OC对象”的内存的

内存管理不当造成两个问题:

一个对象不再使用了,但是依然占据内存,内存泄露

一个对象正在被使用,但却已经释放了,野指针。

5.空指针:

nil:OC实例对象的指针指向nil时,这个指针就是一个空指针

1.给空指针发送消息不会报错 2、它不会去调用方法

当一个指针已经被release了那么还要对该指针做一个清空的操作(person = nil)

防止后面使用到该指针的时候导致程序崩溃

6.nil ,Nil ,NULL,NSNull的区别

nil  :OC对象的空指针

Nil  :OC类对象的空指针

NULL :C语言的空指针

NSNull:是一个单例对象,用来在OC的集合中占的位置

7.内存管理的原则:

1、当有人使用这个对象就不要释放这个对象

2、当没有人使用这个对象就释放该对象

8.OC手动内存管理的黄金法则:

凡是调用alloc,new,copy,multableCopy创建一个新对象或调用retain

让对象的引用计数+1,都必须相应的调用一次release或者autorelease

9.@property参数

管理内存

retain 生产内存管理的代码

assign 没有内存管理的代码(默认)

当使用OC对象时候,就用retain

当使用非OC对象(基本数据类型,枚举,结构体)时候,就用assign

当使用NSString,Block对象时候,就用copy

控制线程安全

nonatomic : 非线程安全的,不加锁,速度快(iOS基本都是用这个)

atomic:线程安全的,加锁,速度慢(默认的)

控制访问权限

readonly 表示只读,只生成getter方法,不生产setter方法

readwrite 表示可读写的,既生成getter又生产setter方法

修改getter和setter方法名称

getter=getter方法的名称

setter=setter方法的名称:

一般当一个成员变量是BOOL类型时候,需要修改getter方法名称,为is+属性名称首字母大写

10.@class 使用格式

@lass 类名;

作用:告诉编译器,@class后面是一个类,但是类中有什么样属性,什么方法都不知道

@class 主要功能就是用来解决循环导入问题

在头文件中使用@class说明这个类

如果在实现文件中有用到这个类的方法或属性,就必须在实现文件(.m文件)导入这个类

11.循环retain,导致在环中的所有对象对象都不能释放,(内存泄露)

解决方法:

只要环中有一条线用retain的,另一条线是assign

注意:用assign的一端在重写dealloc方法时不需要给对方的对象做release释放操作

12.autorelease 基本使用

作用:延迟对象的释放时间

原理:

当一个对象调用autorelease时候,就会把这个对象放到自动释放池中,这时候对象应用计数器没有发生改变

当自动释放池销毁的时候,会对池中所有对象进行一次release操作

当你给一个对象发送多少次autorelease消息,那么当自动释放池销毁时候,就会相应的调用多少次release

你可能感兴趣的:(OC 内存管理)