创建一个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];