天天看点

oc的内存管理初级

创建一个person类在.h,声明属性

//凡是语义设置使用了retain copy的属性,其对应的实例变量都需要在dealloc方法里面release一次

@property (nonatomic ,copy)NSString *hobby;

@property (nonatomic , retain)NSString *name;

@property (nonatomic ,retain)NSString *gender;

@property(nonatomic , assign)int age ;

在person的.m中实现方法

#warning 永远不要手动调用delloc方法!

从写delloc方法当引用计数为0时自动执行此方法

//-(void)dealloc{

//    NSLog(@"对象被销毁会执行此方法");

//    [super dealloc];//必须先向父类发送delloc消息

//}

//(✨✨✨✨)

//实现copy协议里的方法

//浅拷贝

//-(id)copyWithZone:(NSZone *)zone{

//    

//    //直接返回对象本身

//    return [self retain];

//}

//深拷贝

-(id)copyWithZone:(NSZone *)zone{

    //创建一个新对象

    Person *p = [[Person allocWithZone:zone]init];

//实例变量的赋值

    p.name = self.name;

    p.gender = self.gender;

    p.age = self.age;

   //通用方法

 id obj = [[[self class]allocWithZone:zone]init];

    return [p autorelease];

}

-(void)dealloc{

    [_name release];

    [_gender release];

    [_hobby release];

    NSLog(@"对象被销毁后调用");

    [super dealloc];

}

//便利构造器内存管理方式

+(id)personWithName:(NSString *)name{

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

    p.name = name;

    return [p autorelease];

}

在main主函数中

   //+alloc对象的引用计数从0到1

    Person *p1 = [[Person alloc]init];

    Person *per = [Person new];

    //retain使对象的引用计数+1

    [p1 retain];

    [p1 retain];

    //autorelease在将来的某一时刻对象的引用计数减1

    [p1 autorelease];

    //引用计数减1(release)

    [p1 release];

    [p1 release];

    [p1 release];

  //retaincount  检测对象的引用计数(仅对我们定义的类有检测意义);

    //new 对象的引用计数从0到1

    NSLog(@"%lu",[p1 retainCount]);

    NSLog(@"%lu",[per retainCount]);

    //写在pool的创建和pool的释放之间的代码会被自动释放池管理

    //当释放池释放的时候,池内所有的对象都会将autorelease的释放操作执行

    //自动释放池以栈的方式来管理当中的对象(先进后出)

//系统的类簇研究深浅拷贝

    Person *p6 = [[Person alloc]init];

    Person *p7  = [[Person alloc]init];

    Person *p8 = [[Person alloc]init];

    Person *p9 = [[Person alloc]init];

       //父类指针可以指向子类对象

// NSObject *p = [[Person alloc]init];

//    //子类指针不允许指向父类对象

//    Person *_p = [[NSObject alloc]init];

    //copy:将原来的对象拷贝一份,保持原来的特性(不可变对象拷贝完任然为不可变对向,可变仍然为可变对象)

    //mutableCopy:将原来的对象进行可变拷贝,无论原来的对象是否可变,拷贝后都是可变对象

//oc中没有真正意义上的深拷贝.除了归档和反归档(✨✨✨✨✨✨)

//    //1.浅拷贝:不可变数组copy为不可变数组

//    NSArray *array1 = @[p6,p7,p8,p9];

//    

//    

//    NSArray *_array1 = [array1 copy];

//       //深拷贝:不可变数组拷贝为可变数组

//    NSMutableArray *mutArray = [array1 mutableCopy];

//    //2.深拷贝:可变数组拷贝为可变数组

//    NSMutableArray *mutarray1 = [array1 mutableCopy];

//    NSLog( @"%p - %p",mutarray1,array1);

//    

//    

//    //3.可变数组拷贝为可变数组

// //原来的类型copy后还是什么类型

//  NSMutableArray *_mutarray1 = [mutarray1 copy];

//    NSLog(@"%p - %p",mutarray1 , _mutarray1);

//    

//    

//    

//  //4.可变数组拷贝为可变数组

//  NSMutableArray *_mutarray2 = [mutarray1 mutableCopy];

    Person *person = [[Person alloc]init];

   Person *person1 = [person copy];

    NSLog(@"%@ - %@",person1 ,person);

    [person release];

    [person1 release];

继续阅读