您的位置:首页 > 移动开发 > IOS开发

IOS内存管理示例代码

2014-03-08 12:44 323 查看
内存管理的是—> 堆内存部分

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

内存管理原则:

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 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);
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: