Copy

作者: 夜雨聲煩_ | 来源:发表于2017-05-16 11:25 被阅读0次
概述

用@property声明 NSString、NSArray、NSDictionary 经常使用copy关键字,是因为他们有对应的可变类型:NSMutableString、NSMutableArray、NSMutableDictionary,他们之间可能进行赋值操作,为确保对象中的字符串值不会无意间变动,应该在设置新属性值时拷贝一份。

Copy与字符串

copy在面对nsstring时和strong一样
但copy在面对nsmutablestring时和srong有所区别 copy做的是深拷贝 创建了新的地址 而strong只是单纯的地址引用

@interface ViewController ()

@property (strong, nonatomic) NSMutableString *initialStr;
@property (strong, nonatomic) NSString *normalStr;
@property (copy, nonatomic) NSString *aCopyStr;

@end

@implementation ViewController

- (void)viewDidLoad {
    [super viewDidLoad];
    
    self.initialStr = [NSMutableString stringWithString:@"初始"];
    self.normalStr = self.initialStr;
    self.aCopyStr = self.initialStr;
    [self.initialStr replaceCharactersInRange:NSMakeRange(0, 2) withString:@"变化"];
    NSLog(@"initialStr:%@,normalStr:%@,coryStr:%@",self.initialStr,self.normalStr,self.aCopyStr);
    //打印结果为:initialStr:变化,normalStr:变化,coryStr:初始
    
    
   self.initialStr = (NSMutableString*)@"变化";
    NSLog(@"initialStr:%@,normalStr:%@,coryStr:%@",self.initialStr,self.normalStr,self.aCopyStr);
    //打印结果为:initialStr:变化,normalStr:初始,coryStr:初始
}

使用replace或者append对NSMutableString的值进行改变的时候,改变的是intitialStr地址内的值,此时浅拷贝normalStr跟随变化,修饰词为copy的深拷贝字符串copyStr不跟随变化。而使用@""赋值相当于赋予新的内存地址,此时无论深拷贝还是浅拷贝均指向初始地址,值不变。
以下两种深拷贝效果一样:

@property (copy, nonatomic) NSString *aCopyStr;
self.aCopyStr = self.initialStr;

@property (strong, nonatomic) NSString *aCopyStr;
self.aCopyStr = [self.initialStr mutableCopy];
Copy与Block

block属性声明使用copy
block中使用本地变量如self,若使用assign会使block放在栈上,当栈被释放时本地变量将不可访问,会bad access
而声明copy后,在block使用self会造成循环引用,因此要转成weak。详见Block章节说明。
使用如下:

//1
__weak CurrentViewController* blockSelf = self;
//2
__weak __typeof__(self) weakSelf = self
//3
@weakify(self)

但是在block中如果执行完[self dosomething]后self可能会被置为nil,因此在之后[self dootherthing]时会出错
所以:如果在 Block内需要多次访问self,则需要使用strongSelf。

//1
__strong __typeof(self) strongSelf = weakSelf 
//2
@strongify(self)

相关文章

  • Copy Copy Copy

    说到Copy 大多会想到浅复制(指针复制),深复制(内容复制)。看一张图: 你会发现对于集合类型,深复制那写的是...

  • 2018-09-27

    copy的问题 copy.copy返回浅copy copy.deepcopy返回深copy 1fromcopyim...

  • 关于深copy和浅copy

    深copy 所谓深copy是指内容copy 浅copy 所谓浅copy是指指针copy 集合的单层深copy 在多...

  • golang 值和指针

    地址copy,引用copy 值copy

  • Python的直接赋值,深拷贝和浅拷贝以及使用场景

    概述 深浅拷贝用法来自copy模块导入模块: import copy浅拷贝: copy.copy深拷贝: copy...

  • day 9

    浅拷贝和深拷贝 copy.copy(对象):浅拷贝 copy.deepcopy(对象):深拷贝 copy.copy...

  • day-9-函数基础

    import copy"""copy.copy(对象):浅拷贝copy.deepcopy(对象):深拷贝""" a...

  • 深浅拷贝判断地址是否相同

    导入 import copy 模块 浅拷贝:copy.copy() 深拷贝:copy.deepcopy() 代码:...

  • 内存管理

    ARC MRC 属性 循环引用 深浅copy一 ,先说深浅copy概念很简单 浅copy 就是copy...

  • Python浅拷贝与深拷贝

    Python浅拷贝与深拷贝 讨论import copy中copy.copy与copy.deepcopy区别。 根据...

网友评论

      本文标题:Copy

      本文链接:https://www.haomeiwen.com/subject/gpflxxtx.html