【金沙官网线上】移动端h5实现复制功能

首先遇到这个需求是就各种百度,但是发现基本都是用js实现,而且兼容性还非常不好。

1、系统对象的复制

不管是集合类对象,还是非集合类对象,接收到copymutableCopy消息时,都遵循以下准则:

  • copy返回immutable对象;所以,如果对copy返回值使用mutable对象接口就会crash;
  • mutableCopy返回mutable对象;

下图详细阐述了NSStringNSMutableStringNSArrayNSMutableArrayNSDictionaryNSMutableDictionary分别调用copy金沙官网线上,与mutableCopy方法后的结果:

金沙官网线上 1

但是在寻觅和尝试的过程中,发现只需要css代码也可以完全实现的,对需要复制内容的标签加上下面这几行代码就可以了。

1.1 非集合类对象的copy与mutableCopy

系统非集合类对象指的是NSStringNSNumber之类的对象。下面看一下非集合类NSString对象拷贝的例子:

-webkit-touch-callout: all;
-webkit-user-select: all;
-moz-user-select: all;
-ms-user-select: all;
user-select: all;

copy

NSString *string = @"origin";
NSString *stringCopy = [string copy];
NSMutableString *stringMCopy = [string mutableCopy];

NSLog(@"%p", string);
NSLog(@"%p", stringCopy);
NSLog(@"%p", stringMCopy);

2016-03-10 17:32:04.479 Homework[21715:2353641] 0x1000d0ea0
2016-03-10 17:32:04.481 Homework[21715:2353641] 0x1000d0ea0
2016-03-10 17:32:04.481 Homework[21715:2353641] 0x17006fe40

通过查看内存,可以看到stringCopystring的地址是一样,进行了指针拷贝;而stringMCopy的地址和string不一样,进行了内容拷贝。

其实意思就是不限制用户对内容的操作,不禁用系统默认菜单,长按会显示系统自带的复制功能进行复制。

mutableCopy

NSMutableString *string      = [NSMutableString stringWithString: @"origin"];
//copy
NSString *stringCopy         = [string copy];
NSMutableString *mStringCopy = [string copy];
NSMutableString *stringMCopy = [string mutableCopy];

NSLog(@"%p", string);
NSLog(@"%p", stringCopy);
NSLog(@"%p", mStringCopy);
NSLog(@"%p", stringMCopy);

2016-03-10 17:34:11.486 Homework[21728:2354359] 0x17426f800
2016-03-10 17:34:11.487 Homework[21728:2354359] 0x174230600
2016-03-10 17:34:11.487 Homework[21728:2354359] 0x1742306e0
2016-03-10 17:34:11.487 Homework[21728:2354359] 0x174267240

//change value
[mStringCopy appendString:@"mm"]; //crash
[string appendString:@" origion!"];
[stringMCopy appendString:@"!!"];

crash的原因就是copy返回的对象是immutable对象。

就是这么简单

1.2 集合类对象的copy与mutableCopy

集合类对象是指NSArrayNSDictionaryNSSet之类的对象。下面看一下集合类NSArray对象使用copymutableCopy的一个例子:

本文由金沙官网线上发布于Web前端,转载请注明出处:【金沙官网线上】移动端h5实现复制功能

您可能还会对下面的文章感兴趣: