IOS内存管理示例代码

来源:互联网 发布:二合一沐浴露 知乎 编辑:程序博客网 时间:2024/05/23 14:30
内存管理的是—> 堆内存部分

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

内存管理原则:

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

OC -----内存管理


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 allocinitWithName: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 allocinit];
        
Car * mamaCar = [papaCar retain];//retainCount+1
        
Car * sonCar = [mamaCar retain];//retainCount+1
        
Car *friendCar = sonCar;//直接指向
        
//结果都一样
        
//由于 papaCar-->alloc int  1mamaCar +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 allocinit];//1
        rooms.
person =newperson;//2
        [newperson 
release];//1
        [rooms 
release];//0-->调用自身dealloc方法销毁自身内存
        
//但是由于我们重写了dealloc方法,所以在销毁自身内存之前,会对Person类型对象通过_person指针发送release消息,让之前的retainCount1Person 类型对象retainCount减为0,系统会调用Person类自己的dealloc,来销毁Person类型对象所占有的内存空间
        
NSLog(@"who is in the room?\n%@",rooms.person);

0 0
原创粉丝点击