标签:
copy 和 mutableCopy
一个对象使用copy或者mutableCopy方法可以创建对象的副本
---------------
copy - 需要先实现NSCopying协议,创建的是不可变副本(如NSString,NSArray,NSDictionary)
---------------
mutableCopy - 需要先实现NSMutableCopying协议,创建的是可变副本(如NSMutableString,NSMutableArray,NSMutableDictionary,默认都已经实现)
像自己创建 的 Person Student 是不可以拷贝的,因为没有实现这两个协议中的一个。
---------------
深拷贝:内容拷贝,源对象和副本指向的是不同的两个对象,源对象引用计数器不变,副本计数器设置为1。内容拷贝。区别:有没有产生新对象。
---------------
浅拷贝:指针拷贝,源对象和副本指向的是同一个对象。对象的引用计数器+1,其实相当于做了一次retain操作。地址拷贝。
---------------
只有不可变对象创建的不可变副本(copy)才是浅复制,其他的都是深复制。
OC中copy语法存在的意义就是改变副本不影响源对象。
所以只跟调用的方法名有关系,跟源对象没关系。
内存管理回顾
#pragma mark mutablecopy
void stringMutablecopy(){
//string counter 1
NSString *string=[[NSString alloc] initWithFromat:@”age is %1”,10];
//str counter 1,string counter 1
// Create a new Object it’s counter is 1,source object counter is 1
NSMutableString *str=[string mutableCopy];
NSLog(@”str=%zi”,[str retainCount]); //1
NSLog(@”string=%zi”,[string retainCount]);//1
//so copy release
//not the same Object
NSLog(@”%i”,str==string);//0
//Modify str to check whether string change
[str appendString:@”abcd”];
NSLog(@”string:%@”,string);
NSLog(@”str:%@”,str);
[str release];//str:0
//string counter 0
[string release];
}
void(){
NSString *string=[[NSString alloc] initWithFromat:@”age is %1”,10];
NSLog(@”%zi”,[string retainCount]);
NSString *str=[string copy];// Both can’t change
//浅拷贝 相当于retain ,因为str不可变,为了性能着想,所以返回源对象本身,计数器+1
NSLog(@”%i”,str==string);//1
NSLog(@”%zi”,[string retainCount]);
[str release];
[string release];
}
//结论不论是copy 还是 mutableCopy 都需要release
#praga mark mutable->copy 可变字符串的拷贝
void mutableStringCopy(){
NSMutableString * string=[NSMutableString stringWithFormat:@”age is %i”,10];
NString *str=[string copy];// 深拷贝
NSLog(@“%i”,str==string);
[str release];
}
void mutableStringMutableCopy(){
//肯定是深拷贝
NSMutableString * string=[NSMutableString stringWithFormat:@”age is %i”,10];
NSMutableString * str=[string mutableCopy];
[str appendString:@”1234”];
NSLog(@”str:%@”,str);
NSLog(@”string:%@”,string);
[str release];
}
Student.h
//@property (nonatomic ,retain) NSString *name;
Student.m
//retain代表set方法会release旧对象,retain新对象
-(void)setName:(NSString *)name{
if(_name!=name){
[_name release];
_name=[name retain];
}
}
-(void)dealloc{
[_name release];
[super dealloc];
}
Student.h
//修改外部的变量并不会影响到内部成员
@property (nonatomic ,copy) NSString *name;
Student.m
//copy代表set方法会release旧对象,copy新对象
-(void)setName:(NSString *)name{
if(_name!=name){
[_name release];
_name=[name copy];
}
}
-(void)dealloc{
[_name release];
[super dealloc];
}
//pragma mark show copy name of Student (前面的懂,这就模糊了)
#import “Student.h”
void studentNameCopy(){
Student *stu=[[[Student alloc] init]autorelease];
NSMutableString *string=[NSMutableString stringWithFormat:@”age is %i”,10];
stu.name=string;
[string appendString;@“123”];
NSLog(@”name=%@”,stu.name);
NSLog(@”string=%@”,string);
}
//字符串建议一般用copy,其他对象一般用retain
44.53
标签:
原文地址:http://www.cnblogs.com/yesihoang/p/4561399.html