IOS内存管理示例代码

内存管理的是—> 堆内存部分

内存—>  堆、栈、全局《包含常量区》、系统自带

内存管理原则:

1.凡是alloc 、retain、copy的地方,都应出现release 或是 autorelease与之对应;
2.属性为retain 或 copy 时,需要在类的dealloc 中释放此属性;
3.便利构造器本身包含autorelease;
4.一定不要释放没有所有权的对象,不要手动调用dealloc;



OC  的两大机制:

  1、消息传递机制<方法调用>
  2、引用计数;

属性的作用
  1.声明实例变量 
   2.setter和Getter方法 及实现

copy —>针对的是特殊的对象类型
     必须遵守了NSCopying协议的对象


   关键字                           retainCount     描述

  alloc                                      1            创建对象——>拥有对象所有权

init                                           1           初始化

dosomething                           1           执行方法

retain                                       2          增加 1  ——>  拥有对象所有权

release                                     1          减去1  ——-> 放弃对象的所有权
 
dealloc                                     0        销毁对象
 


// 初始化方法
-(
id )initWithName:( NSString  *)name age:( int )age{
    
self  =[ super   init ];
    
if  ( self ) {
        
self . name  = name;
        
self . age  = age;
    }
    
return    self ;
}
// 便利构造器
+(
id )personWithName:( NSString  *)name
                age:(
int )age{
    
Person  *per = [[ Person   alloc initWithName :name  age :age];
    
return   per;
}

//Person 类的实例对象生命周期结束的标志就是 系统调用dealloc 方法销毁内存
//重写  系统dealloc -->析构函数方法

-(
void)dealloc{
    
  // 输出执行方法的方法名和所在行数
    
NSLog ( @" 打印方法名: %s" , __FUNCTION__ ,__LINE__);
    [
_name   release ]; // 当前 person  类的对象所拥有的 _name 实例对象需要被释放所有权,以便 _name 对象通过系统自动调用其本身的 dealloc 销毁内存
    [
super   dealloc ];
}



         Person  *person = [ Person   personWithName : @"lily"   age : 23 ];
        
NSLog ( @"person 的引用计数为: %lu" ,[person retainCount]); // 打印引用计数
        [person 
retain ]; // 应用计数  +1
        
NSLog ( @"person 的引用计数为: %lu" ,[person retainCount]); // 打印引用计数
        [person 
release ]; // 释放
        
NSLog ( @"person 的引用计数为: %lu" ,[person retainCount]); // 打印引用计数
        [person 
release ]; // 释放
        
NSLog ( @"person 的引用计数为: %lu" ,[person retainCount]); // 打印引用计数


Car  * papaCar = [[ Car   alloc init ];
        
Car  * mamaCar = [papaCar  retain ]; //retainCount+1
        
Car  * sonCar = [mamaCar  retain ]; //retainCount+1
        
Car  *friendCar = sonCar; // 直接指向
        
// 结果都一样
        
// 由于  papaCar-->alloc int    1 mamaCar +1   sonCar+1   最终操作的都是同一个对象,只是指针不同但指向相同
        
NSLog ( @"papaCar = %lu " ,[papaCar  retainCount ]);
        
NSLog ( @"mamaCar = %lu " ,[mamaCar  retainCount ]);
        
NSLog ( @"sonCar = %lu " ,[sonCar  retainCount ]);
        
NSLog ( @"friendCar = %lu " ,[friendCar  retainCount ]);
        [sonCar 
release ];
        
NSLog ( @"friendCar = %lu " ,[friendCar  retainCount ]);
        [mamaCar 
release ];
        
NSLog ( @"sonCar = %lu " ,[sonCar  retainCount ]);
        [papaCar 
release ];
        
NSLog ( @"papaCar = %lu " ,[papaCar  retainCount ]);


@interface  Room :  NSObject
/*
 Room
类有一个 Person 类型的属性: person
 */


//@property (nonatomic,assign)Person *person;
@property  ( nonatomic , retain ) Person  *person;

//-(void)setPerson:(Person *)person{
//    _person = person;
//}
// 重写 dealloc 方法
-(
void )dealloc{
    
NSLog ( @" 打印 room 中的 dealloc%s" , __FUNCTION__ ,__LINE__);
    [
_person   release ]; // 重写了原有方法中没有的内容
    [
super   dealloc ];
    
}


//         对房间的相关操作
        
Person  *newperson = [ Person   personWithName : @"lily"   age : 23 ]; //1
        
Room  * rooms = [[ Room   alloc init ]; //1
        rooms.
person  =newperson; //2
        [newperson 
release ]; //1
        [rooms 
release ]; //0--> 调用自身 dealloc 方法销毁自身内存
        
// 但是由于我们重写了 dealloc 方法,所以在销毁自身内存之前,会对 Person 类型对象通过 _person 指针发送 release 消息,让之前的 retainCount 1 Person  类型对象 retainCount 减为 0 ,系统会调用 Person 类自己的 dealloc ,来销毁 Person 类型对象所占有的内存空间
        
NSLog ( @"who is in the room?\n%@" ,rooms. person );

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

GFanStudio-LeeSir

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值