oc中的copy并不难,只要细心的理解每个碎知识点就一定能掌握,下面我就带着大家一起来征服它!
拷贝分为深拷贝和浅拷贝
浅拷贝:不产生新的对象,直接指向原有对象
深拷贝:产生新的对象,其内容是原有对象的内容
拷贝: NSCopy 、 NSMutableCopy
深拷贝:产生新的对象,其内容是原有对象的内容
拷贝: NSCopy 、 NSMutableCopy
NSCopy 拷贝出的结果是不可变对象,跟其接受类型没有关系,跟其传入类型也没有关系, NSMutablecopy 拷贝的结果是可变对象,跟其传入的类型没有关系,但是会受其接收类型的影响, 当使用 NSCopy 复制一个不可变对象时,其行为是浅复制,其余情况都是深拷贝。
当使用
NSMutablecopy
时,是深拷贝(前提是copy系统自带nsstring,naarry。。。等
建一个person类;
main函数:
#import
<Foundation/Foundation.h>
#import "Person.h"
int main( int argc, const char * argv[]) {
@autoreleasepool {
Person *p = [[ Person alloc ] init ];
NSMutableString *s = [ NSMutableString stringWithFormat : @"胡 汉三 " ];
p. name = s;
NSLog ( @"%@" ,p);
//打印结果 :胡汉三
#import "Person.h"
int main( int argc, const char * argv[]) {
@autoreleasepool {
Person *p = [[ Person alloc ] init ];
NSMutableString *s = [ NSMutableString stringWithFormat : @"胡 汉三 " ];
p. name = s;
NSLog ( @"%@" ,p);
Person
*p1 = [p
mutableCopy
];
//深拷贝,p1的地址和p不一样,可以打印地址看一下
[s setString : @" 王五 " ];
p1. name = s;
NSLog ( @"%@,%@" ,p,p1);
[s setString : @" 王五 " ];
p1. name = s;
NSLog ( @"%@,%@" ,p,p1);
//打印结果 p = 胡汉三 ,p1 = 王五
}
return 0;
}
return 0;
}
---------------------------------------------------------------------------------------
person.h文件
#import
<Foundation/Foundation.h>
@interface Person : NSObject < NSCopying , NSMutableCopying >
@property ( nonatomic , copy ) NSString *name;
@interface Person : NSObject < NSCopying , NSMutableCopying >
@property ( nonatomic , copy ) NSString *name;
//定义一个name属性,此时括号里应该用copy 而不是strong。
@end
--------------------------------------------------------------------------------------
person.m 文件
#import
"Person.h"
@implementation Person
-( NSString *)description{
return _name ;
}
// 如果直接 return self ,则是浅拷贝,如果使用 alloc ,则是深拷贝
-( id )copyWithZone:( NSZone *)zone{
Person *p = [ Person allocWithZone :zone];
return p;
}
// 如果直接 return self ,则是浅拷贝,如果使用 alloc ,则是深拷贝
-( id )mutableCopyWithZone:( NSZone *)zone{
Person *p = [ Person allocWithZone :zone];
return p;
@implementation Person
-( NSString *)description{
return _name ;
}
// 如果直接 return self ,则是浅拷贝,如果使用 alloc ,则是深拷贝
-( id )copyWithZone:( NSZone *)zone{
Person *p = [ Person allocWithZone :zone];
return p;
}
// 如果直接 return self ,则是浅拷贝,如果使用 alloc ,则是深拷贝
-( id )mutableCopyWithZone:( NSZone *)zone{
Person *p = [ Person allocWithZone :zone];
return p;
}