MRC内存管理1

来源:互联网 发布:鸟哥php 编辑:程序博客网 时间:2024/06/06 05:32
野指针和内存泄露// 1.内存泄露                Person *person = [[Person alloc]init]; // 1        NSLog(@"person count = %ld",person.retainCount);                [person retain]; // 2                Person *person1 = [person retain]; // 3                [person release];// 2        [person1 release];// 1                // 配对原则        // 对象的retainCount != 0的时候 不会调用dealloc方法        // 函数销毁对象,对象会一直存在内存中造成内存泄露           // 2.内存泄露                Person *person2 = [[Person alloc]init];        person2 = nil;//        [person release];        NSLog(@"person2 --- = %ld",[person2 retainCount]); // 0// 3.野指针        Person *person3 = [[Person alloc]init];        NSLog(@"person3 count = %ld",person3.retainCount);          Person *person4 = [person3 retain];        [person3 release];        [person4 release];        //        NSLog(@"person3 count = %ld",person3.retainCount);        // 打印野指针的retainCount        person3 = nil;        person4 = nil;                [person3 run]; // [nil run];        // 对象访问了不可访问的空间 // 4.        // 在一个对象调用dealloc 函数销毁之后        //  是不会起死回生的        Person *person5 = [[Person alloc]init];        [person5 release];        // EXC_BAD_ACCESS 访问了不可访问的内存空间        [person5 retain]; // 单个对象的内存管理        Person *person = [[Person alloc]init];        NSString *string = [NSString stringWithFormat:@"hello world"];        person.name = string;        person.age = 21;        NSLog(@"%@",person);        NSLog(@"%ld",[person.name retainCount]);        //        [string release];                // NSString *string = @"test";//        不需要释放,属于常量类型,程序会把这部分数据放到全局变量存储区                // NSString *string1 = [NSString stringWithFormat:@"test"];//        种类型生成的NSString是autorelease类型的变量,不需要释放,程序一次runLoop结束后就会释放。                // NSString *string2 = [[NSString alloc]initWithFormat:@"test"];//        这种类型的需要释放,因为alloc过了,需要手动用release释放,                NSLog(@"%p %p",[person name],string);        [person release];        NSLog(@"%ld ",string.retainCount);        person = nil;            }setter方法的内存管理- (void)setCar:(Car *)car {        if (car != _car) {        [_car release]; // 第一次为nil release没事        ///在setCar 的时候让car的retainCount+1 拿到car的强引用        _car = [car retain];            }    }- (void)dealloc {    [super dealloc];    // 保证person对象销毁的时候,它所强引用的car也被销毁,防止出现内存泄露    [_car release];    NSLog(@"person is dealloc");}循环引用  /*          与@property内存管理有关的参数                  retain         生成符合内存管理原则的set方法         assign         直接赋值,不考虑内存管理         nonatomic      不生成多线程相关的代码                  readonly       只生成getter方法         readwrite      生成getter和setter方法         @property (nonatomic,assign,setter = isVip:,getter = isVip) BOOL isVip;         */@property (nonatomic,retain) Car *car;// 如果重写了setter和getter方法,property就不会再生成 _car// 需要自己声明成员变量 _car 在 .h中 或者  在@synthesize 后面// 如果程序中出现了相互引用问题,那么一端一定要改成弱引用方式        

0 0
原创粉丝点击