自定义拷贝:实现NSCopying协议,覆盖
- (id)copyWithZone:(NSZone *)zone 方法
属性拷贝:当copy修饰可变对象时,则为深拷贝需要注意内存管理;修饰不可变对象时,则为浅拷贝.
实例:
//
// Person.h
// DefineCopying
//
// Created by 5016 on 13-12-16.
// Copyright (c) 2013年 dradon. All rights reserved.
//
#import <Foundation/Foundation.h>
@interface Person : NSObject<NSCopying>//实现copying协议(接口)
@property(retain,nonatomic)NSString* name;
@property(assign,nonatomic)NSInteger age;
//属性copy
@property(copy,nonatomic)NSArray *array;
@property(copy,nonatomic)NSMutableArray *marray;
-(Person *)initWithName:(NSString*)name andAge:(NSInteger)age;
@end
//
// Person.m
// DefineCopying
//
// Created by 5016 on 13-12-16.
// Copyright (c) 2013年 dradon. All rights reserved.
//
#import "Person.h"
@implementation Person
@synthesize name = _name,age = _age;
//属性copy
@synthesize array = _array,marray = _marray;
-(Person *)initWithName:(NSString*)name andAge:(NSInteger)age
{
if (self = [super init]) {
_name = name;
_age = age;
}
return self;
}
/*
*实现协议(接口)的copy==>自定义copy
*实现NScoping的协议内容,让自定义的类拥有copy方法,当对象调用copy方法时,该方法会执行
*/
- (id)copyWithZone:(NSZone *)zone
{
//写法1
// Person *per = [[Person alloc] init];
// if (self = [super init]) {
// per.name = self.name;
// per.age = self.age;
// }
// return [per autorelease];
//写法2
Person *per = [[[self class]allocWithZone:zone]init];
per.name = [_name copy];
per.age = _age;
return per;
}
-(void)dealloc
{
[_name release];
[_array release];//使用retain或者copy的对象,都需要再dealloc方法中释放一次
[_marray release];
[super dealloc];
}
@end
//
// main.m
// DefineCopying
//
// Created by 5016 on 13-12-16.
// Copyright (c) 2013年 dradon. All rights reserved.
//
#import <Foundation/Foundation.h>
#import "Person.h"
int main(int argc, const char * argv[])
{
@autoreleasepool {
//1.自定义copy,深copy
NSLog(@"========自定义copy,覆盖协议(接口)方法,自动拷贝,属于深copy=======");
Person *p1 = [[Person alloc] initWithName:@"dragon" andAge:23];
Person *p2 = [p1 copy];
NSLog(@"p1=%p",p1);
NSLog(@"p2=%p",p2);
NSLog(@"p1的名字为%@,p1的年龄为%ld",p1.name,p1.age);
NSLog(@"p2的名字为%@,p2的年龄为%ld",p2.name,p2.age);
//2.属性copy
//当copy修饰不可变属性是,就相当于retain,只是引用计数加一,当copy修饰可变属性时,就和retain不同了,copy出来的对象会是深copy,要注意内存管理
//属性:不可变对象,浅copy
NSLog(@"========属性:不可变对象,浅copy=======");
NSArray *array=[[NSArray alloc]initWithObjects:@"iphone",@"ipad",@"android" ,nil];
NSLog(@"array的引用计数为%ld",[array retainCount]);
p1.array=array;//copy了//2
NSLog(@"array的引用计数为%ld",[array retainCount]);
NSLog(@"array的地址为%p",array);
[array release];//1
NSLog(@"p1.array的引用计数为%ld",[p1.array retainCount]);
NSLog(@"p1.array的地址为%p",p1.array);
[p1.array release];//0
NSLog(@"p1.array的引用计数为%ld",[p1.array retainCount]);
// NSLog(@"array的引用计数为%ld",[array retainCount]);
//属性:可变对象,深拷贝
NSLog(@"========属性:可变对象,深拷贝=======");
NSMutableArray *marray=[[NSMutableArray alloc]initWithObjects:@"1",@"2",@"3", nil];
p1.marray=marray;
NSLog(@"marray的引用计数为%ld",[marray retainCount]);
NSLog(@"marray的地址为%p",marray );
NSLog(@"p1.marray的引用计数为%ld",[p1.marray retainCount]);
NSLog(@"p1.marray的地址为%p",p1.marray);
[marray release];
}
return 0;
}