博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
iOS 浅谈:深.浅拷贝与copy.strong
阅读量:4487 次
发布时间:2019-06-08

本文共 3229 字,大约阅读时间需要 10 分钟。

浅谈:深.浅拷贝与copy.strong

深.浅拷贝

  • copy mutableCopy NSString
NSString *string = @"汉斯哈哈哈";// 没有产生新对象NSString *copyString = [string copy];// 产生新对象NSMutableString *mutableCopyString = [string mutableCopy];NSLog(@"string = %p copyString = %p mutableCopyString = %p", string, copyString, mutableCopyString);
  • copy mutableCopy NSMutableString
NSMutableString *string = [NSMutableString stringWithString:@"汉斯哈哈哈"];// 产生新对象NSString *copyString = [string copy];// 产生新对象NSMutableString *mutableCopyString = [string mutableCopy];NSLog(@"string = %p copyString = %p mutableCopyString = %p", string, copyString, mutableCopyString);

结论:

注意:其它对象NSArray、NSMutableArray 、NSDictionary、NSMutableDictionary一样适用

  • copy NSObject
HSPerson *p = [[HSPerson alloc] init];p.age = 20;p.height = 170.0;HSPerson *copyP = [p copy]; // 这里崩溃

崩溃:

看崩溃信息HSPerson应该先实现:

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

測试:

#import "HSPerson.h"@interface HSPerson()
@end@implementation HSPerson- (id)copyWithZone:(NSZone *)zone{ return @"汉斯哈哈哈";}@end
HSPerson *p = [[HSPerson alloc] init];p.age = 20;p.height = 170.0;HSPerson *copyP = [p copy];NSLog(@"copyP: %@", copyP);

能够看出copyWithZone又一次分配新的内存空间。则:

- (id)copyWithZone:(NSZone *)zone{    HSPerson *person = [[HSPerson allocWithZone:zone] init];    return person;// 有些人可能以下alloc,又一次初始化空间,但这方法已给你分配了zone,自己就无需再次alloc内存空间了//    HSPerson *person = [[HSPerson alloc] init];}
HSPerson *p = [[HSPerson alloc] init];p.age = 20;p.height = 170.0;HSPerson *copyP = [p copy];NSLog(@"p = %p copyP = %p", p, copyP);NSLog(@"age = %d height = %f", copyP.age, copyP.height);

尽管copy了份新的对象,然而age,height值并未copy,那么:

- (id)copyWithZone:(NSZone *)zone{    HSPerson *person = [[HSPerson allocWithZone:zone] init];    person.age = self.age;    person.height = self.height;    // 这里self事实上就要被copy的那个对象,非常显然要自己赋值给新对象。所以这里能够控制copy的属性    return person;}

这时你会想。有NSMutableCopying?没错,是有这货:

- (id)mutableCopyWithZone:(NSZone *)zone{    HSPerson *person = [[HSPerson allocWithZone:zone] init];    person.age = self.age;    person.height = self.height;    return person;}

NSCopying、NSMutableCopying有啥差别?

事实上感觉不是必需有NSMutableCopying,由于压根就没可变的HSPerson,但假设该对象有其它行为,能够借用NSMutableCopying实现,哈哈哈

copy.strong

说完深浅拷贝。理解copy.strong就轻松多了!

  • copy
#import 
@interface HSPerson : NSObject@property (nonatomic, copy) NSString *name;@end
NSMutableString *string = [NSMutableString stringWithFormat:@"汉斯哈哈哈"];HSPerson *person = [[HSPerson alloc] init];person.name = string;// 不能改变person.name的值,由于其内部copy新的对象[string appendString:@" hans"]; NSLog(@"name = %@", person.name);

property copy 实际上就对name干了这个:

- (void)setName:(NSString *)name{    _name = [name copy];}

如果name为NSMutableString。会发生什么事?

@property (nonatomic, copy) NSMutableString *name;

这样会挨骂哦,实际上内部还是:

- (void)setName:(NSMutableString *)name{    _name = [name copy];}

copy出来的仍然是不可变字符。假设有人用NSMutableString的方法,就会崩溃:

  • strong
@property (nonatomic, strong) NSString *name;
NSMutableString *string = [NSMutableString stringWithFormat:@"汉斯哈哈哈"];HSPerson *person = [[HSPerson alloc] init];person.name = string;// 能够改变person.name的值,由于其内部没有生成新的对象[string appendString:@" hans"];NSLog(@"name = %@", person.name);

总结:用copy与strong取决于需求。假设不希望被外界更改用copy。反之用strong

转载于:https://www.cnblogs.com/jhcelue/p/7028003.html

你可能感兴趣的文章
Tomcat SSL配置 Connector attribute SSLCertificateFile must be defined when using SSL with APR解决...
查看>>
C# 关于类的事件和委托
查看>>
RAD Studio XE8跨平台实现APP中的录音、录像功能
查看>>
【原】Storm环境搭建
查看>>
关于flex元素超出父元素的解决方法
查看>>
SpringMVC整合kaptcha(验证码功能)
查看>>
[置顶] Android Sensor系统剖析(4.0)(下)
查看>>
通用高性能 Windows Socket 组件 HP-Socket v2.2.2 更新发布
查看>>
友盟分享
查看>>
并发编程
查看>>
SQL SERVER 常用命令
查看>>
SQL SERVER 锁2
查看>>
PERCONA-TOOLKIT 工具文档
查看>>
再议mysql 主从配置
查看>>
cocos2dx中设置横竖版
查看>>
数据结构与算法之间的关系
查看>>
android捕获ListView中每个item点击事件
查看>>
海量数据处理算法—Bit-Map
查看>>
CentOS7 对比 CentOS6
查看>>
Android之条码扫描二维码扫描
查看>>