Objective_C内存管理_note


一. 管理范围: 任何继承了NSObject的对象(NSString , NSArray, ...),对基本数据(int ,float, ...)类型无效.

二. 基本原理:

垃圾回收: (OC不支持垃圾回收).

内存泄漏: 用动态存储分配函数动态开辟的空间,在使用完毕后未释放,结果导致一直占据该内存单元,直到程序结束;(如:对象被创建后,指向它的指针 进行了重新指向,  该对象未被释放, 一直占用内存,直到程序结束, 就会产生内存泄漏)

野指针: 指向一块不可用内存 (即对象被销毁, 指针未清空, 利用 p(指针) = nil; 清空指针, p 变为这指针).

原理:
1.每个对象内部都保存了一个与之关联的整数, 称为引用计数器
2.每当使用 alloc new 或者 copy  创建一个对象时, 对象的引用计数器被设置为1
3.给对象发送一条retain 消息时, 引用计数器 +1;
4.给对象发送一条release 消息时, 引用计数器 - 1
5.一旦计数器为 0 ,那么它将被销毁,其占用的内存被系统回收,OC 也会自动向对象发送一条dealloc 消息.一般会重写dealloc 方法(注意 : super 方法一定写在最后),在这里释放相关资源. 一定不能直接调用dealloc 方法.

对象之间的内存管理

三 . 内存管理原则

1.谁创建, 谁释放. 如果通过alloc new 或 copy 来创建一个对象那么你必须调用 release 或 autorealease. (不是你创建的 , 不用你释放).
2.一般来说, 除了alloc new copy 之外的方法都被声明了autorealease
3.谁retain 谁release. 只要你调用了retain ,无论这个对象如何生成的,你都要调用release.

成员变量的内存管理
1.setter 方法管理
release 旧的成员变量, retain 新的成员变量
2. delloc 方法管理
 release成员变量





四. proterty 内存管理

      第一类:读写控制(readonly, readwrite)
       readonly: 只读不写 只声明了getter方法(没有setter方法).
       readwrite: 可读可写 (系统默认属性) 生成setter getter 方法 可以在类外可以使用

      第二类:原子控制 (atomic , noatomic)
      atomic: 为多线程应用程序的安全考虑,经过atomic修饰后, 会占用线程内存资源(一般 应用程序慎用)

      noatomic : 单线程下使用

@property (retain) Book *book; // 相当于生成了 上面写的具有内存管理的setter getter 方法.

第三类:语义控制(retain assign copy)
retain: release 旧值, retain 新值 (用于对象).
assign: 直接赋值, 不做内存管理(默认) (用于基本数据类型).
copy :它指出,在赋值时使用传入值的一份拷贝。拷贝工作由copy方法执行,此属性只对那些实行了NSCopying协议的对象类型有效。

  第四类: 名称控制
 如:
         //给getter方法改名字
@property(getter=func1)NSString*address;
 
        //给setter方法改名字注意:新方法名后加: 因为setter方法有参数
 @property(setter=func2:)NSString*phoneNum;

       //同时改setter和getter方法
 @property(getter=func3,setter=func4:)NSString*groupName;


四. autorelease内存管理
@autoreleasepool
{ // 在内存 (栈区) 中创建一个自动释放池
// autorelease 返回的对象本身
// autorelease 会将对象加入池子中 对象的计数器不变

Person *p = [ [ Person  alloc] init autorelease];


 } // autoreleasepool 执行完 池子销毁, 池子里的所有对象做一次release操作.


苹果官方提供的方法(API):
1.如果方法名是alloc new copy 就不用release 或 autorelease
2.否则必须使用.
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值