美文网首页
copy or strong

copy or strong

作者: 淘代码者 | 来源:发表于2018-05-21 17:05 被阅读0次

MRC下重写setter和getter方法

代码如下:

#import <Foundation/Foundation.h>

@interface Person : NSObject

@property (nonatomic, copy) NSString *name;

@end

#import "Person.h"

@implementation Person

@synthesize name = _name;

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

- (NSString *)name{
    return _name;
}
@end

copy和setter的选择

总结:

  • 对于不可变对象(NSString、NSArray、NSDictionary等),使用copy修饰。
  • 对于可变对象(NSMutableString、NSMutableArray、NSMutableDictionary等),使用strong修饰。
crash问题

把NSMutableArray用copy修饰有时就会crash,因为对这个数组进行了增删改操作,而copy后的数组变成了不可变数组NSArray,没有响应的增删改方法,所以对其进行增删改操作就会报错。

测试过程
以数组为例总结:

#import "ViewController.h"

@interface ViewController ()

@property (nonatomic, strong) NSMutableArray *arr_strong;
@property (nonatomic, copy) NSMutableArray *arr_copy;

@end

@implementation ViewController

- (void)viewDidLoad {
    [super viewDidLoad];
    NSMutableArray *tempArr = [NSMutableArray arrayWithCapacity:0];
    self.arr_strong = tempArr;
    self.arr_copy = tempArr;
    NSLog(@"arr_strong = %@\n arr_copy = %@",[self.arr_strong class],[self.arr_copy class]);
}

@end

输出结果

arr_strong = __NSArrayM(可变数组)
arr_copy = __NSArray0(不可变数组)

所以此时如果对arr_copy进行增删改操作,会造成程序上的崩溃。

数据变化问题

条件:
针对数据变化的问题,会在将可变对象赋值给用strong修饰的不可变对象时产生。

测试代码

#import "ViewController.h"

@interface ViewController ()

@property (nonatomic, strong) NSArray *arr_strong;

@end

@implementation ViewController

- (void)viewDidLoad {
    [super viewDidLoad];
    NSMutableArray *tempArr = [NSMutableArray arrayWithCapacity:0];
    [tempArr addObject:@"A"];
    self.arr_strong = tempArr;
    NSLog(@"arr_strong = %@",self.arr_strong);
    [tempArr addObject:@"B"];
     NSLog(@"arr_strong = %@",self.arr_strong);
}

@end

输出结果

 arr_strong = (
    A
)
arr_strong = (
    A,
    B
)

如果把arr_strong属性修饰改成copy
输出结果

 arr_strong = (
    A
)
 arr_strong = (
    A
)
copy collections

深拷贝和浅拷贝的区别
如下图所示:


浅拷贝就是指针拷贝;深拷贝就是内容拷贝。

copy和mutableCopy
1.不可变对象使用copy,是一个浅拷贝。
2.不可变对象使用mutableCopy,深拷贝。
3.可变对象copy和mutableCopy,都是深拷贝。
但是对于集合类对象来说:上面的深拷贝都是单层深拷贝,并非完全深拷贝。

集合类对象实现单层深拷贝
initWithArray:copyItems: 将第二个参数设置为YES即可深复制。

NSArray *deepCopyArray=[[NSArray alloc] initWithArray: array copyItems: YES];

deepCopyArray内部存储元素,对于不可变元素是指针拷贝,对于可变元素是内容拷贝。类似于内部每个元素调用了copy方法。

集合类对象实现完全深拷贝
将集合进行归档(archive),然后解档(unarchive)。

NSArray *trueDeepCopyArray = [NSKeyedUnarchiver unarchiveObjectWithData:[NSKeyedArchiver archivedDataWithRootObject:oldArray]];

参考资料:

Copying Collections
iPhone Dev:iOS开发之深拷贝与浅拷贝(mutableCopy与Copy)详解
Blog:copy 与 mutableCopy

相关文章

  • iOS 基础知识

    strong & copy 区别 strong & copy 区别 code

  • iOS【copy,strong,retain,weak和assi

    摘录:iOS中copy,strong,retain,weak和assign的区别 copy,strong,weak...

  • copy、strong、mutablecopy

    copy 和strong 1:修饰mutableArra @property (nonatomic,strong)...

  • 2018-03-05

    使用copy跟strong修饰属性的异同 首先声明2个属性,分别是strong,copy修饰 @property ...

  • copy & strong

    用@property声明的NSString(或NSArray,NSDictionary)经常使用copy关键字,为...

  • copy or strong

    MRC下重写setter和getter方法 代码如下: copy和setter的选择 总结: 对于不可变对象(NS...

  • strong or copy

    http://www.jianshu.com/p/731bdaf5f123 http://www.cocoachi...

  • 修饰词用法

    ARC:assign、weak、strong、copy MRC:assign、retain、copy、nonato...

  • strong,copy区别

    strong,copy有何不同?实践出真知!上代码 strong 运行结果 copy 运行结果 分析 当我们进行赋...

  • NSArray 和 NSMutableArray 被strong

    1、NSArray 被copy 、strong修饰后的变化: (1)strong:被strong修饰之后,由于只是...

网友评论

      本文标题:copy or strong

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