您的位置:首页 > 移动开发 > Objective-C

征服objective—c 的NScopy,NSMutablecopy

2015-11-02 19:00 375 查看
oc中的copy并不难,只要细心的理解每个碎知识点就一定能掌握,下面我就带着大家一起来征服它!

拷贝分为深拷贝和浅拷贝
浅拷贝:不产生新的对象,直接指向原有对象

深拷贝:产生新的对象,其内容是原有对象的内容

拷贝:NSCopy、NSMutableCopy

NSCopy拷贝出的结果是不可变对象,跟其接受类型没有关系,跟其传入类型也没有关系,NSMutablecopy拷贝的结果是可变对象,跟其传入的类型没有关系,但是会受其接收类型的影响,当使用NSCopy复制一个不可变对象时,其行为是浅复制,其余情况都是深拷贝。

当使用NSMutablecopy时,是深拷贝(前提是copy系统自带nsstring,naarry。。。等

话不多说还是上代码比较简洁明了:

建一个person类;

main函数:

#import<Foundation/Foundation.h>

#import
"Person.h"

intmain(intargc,constchar
* argv[]) {

@autoreleasepool{

Person *p = [[Personalloc]init];

NSMutableString*s = [NSMutableStringstringWithFormat:@"胡汉三"];

p.name= s;

NSLog(@"%@",p);

//打印结果 :胡汉三

Person*p1 =
[p
mutableCopy];

//深拷贝,p1的地址和p不一样,可以打印地址看一下

[s
setString:@"王五"];

p1.name= s;

NSLog(@"%@,%@",p,p1);

//打印结果 p = 胡汉三 ,p1 = 王五

}

return0;

}

---------------------------------------------------------------------------------------

person.h文件

#import<Foundation/Foundation.h>

@interfacePerson :NSObject<NSCopying,NSMutableCopying>

@property(nonatomic,copy)NSString*name;

//定义一个name属性,此时括号里应该用copy 而不是strong。

@end

--------------------------------------------------------------------------------------

person.m 文件

#import"Person.h"

@implementationPerson

-(NSString*)description{

return_name;

}

//如果直接return self,则是浅拷贝,如果使用alloc,则是深拷贝

-(id)copyWithZone:(NSZone*)zone{

Person *p = [PersonallocWithZone:zone];

returnp;

}

//如果直接return self,则是浅拷贝,如果使用alloc,则是深拷贝

-(id)mutableCopyWithZone:(NSZone*)zone{

Person *p = [PersonallocWithZone:zone];

returnp;

}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: