1.
如果尝试使用自己类中的copy方法如:NewBook=[myBook mutableCopy];就会报错,实现自己的的类进行复制,必须根据<NSCopying>协议实现其中一两个方法。
-(id) copyWithZone:(NSZone *)zone
{
Person *person=[[Person allocWithZone:zone]init];
//复合初始化---
return person;
}
如果你的类可以产生子类,那么copyWithZone:方法将被继承这种情况下,
Person *person=[[Person allocWithZone:zone]init];
应该改为:
id person=[[[self class] allocWithZone:zone]init];
2.
用设值方法和取值方法复制对象
自己实现设值和取值方法,如果没有合成设置方法(setName:andAge:),可以编写使用copy版本的方法:
-(void) setName:(NSString *)theName
{
name=[theName copy];
}
如果声明中指定了copy特性,合成方法会使用类的copy方法(自己编写的或继承父类):
@property
(
nonatomic
,
copy
)
NSString
*name;与
@synthesize指令一起使用,生成的方法与下面类似:
-(void) setName:(NSString *)theName
{
if(theName!=name)
name=[theName copy];
}
使用nonatomic是为了告诉系统不要使用互斥(mutex)锁定保护属性的存取方法。如果知道这段代码只会在单线程中运行,就可以避免使用这种锁定方法。
3.
使用归档程序复制对象
data为NSData类型对象
data=[NSKeyedArchiver archivedDataWithRootObject:dataArray];
dataArray2=[NSKeyedUnarchiver unarchiveObjectWithData:data];
归档和解归档过程中产生的是字符串的新副本