ZJ_iOS面试

NSString使用copy还是strong

2017-01-14  本文已影响188人  西土城小羊

在日常的编程中经常会使用NSString,但是NSString到底是使用copy修饰还是使用strong进行修饰呢?或者说NSString什么时候使用copy什么时候使用strong呢?

当我们使用@property (nonatomic, copy) NSString *a;
并且进行赋值self.a = b ;

  1. 如果b是一个不可变的变量,例如NSString类型,这个时候其实是进行了一次浅拷贝,也就是说这个时候,不管是strong还是copy属性的对象,其指向的地址都是同一个,即为b指向的地址,在MRC环境下的效果都是使b指向的对象的引用计数+1;
  2. 如果b是一个可变的变量,例如NSMutableString 类型,这个时候就有所不同了,因为copy修饰的属性会进行一次深拷贝,也就是说其会创建一个新的对象,另外需要注意的是,这个copy属性对象的类型始终是NSString,而不是NSMutableString,因此其是不可变的。;

当我们使用@property (nonatomic, strong) NSString *a;
并且进行赋值self.a = b ;

  1. 无论b是可变的类型或是不可变的类型,都不会创建一个新的对象,效果都是a指向了b指向的对象,在MRC环境下,就是b指向的对象的引用计数+1
  2. 这种情况带来了一个问题,如果b为可变类型,并且b在外部进行了一些修改,这样导致了a也会改变,不安全;另外,如果b是一个可变的类型例如NSMutableString 类型,那么,_a的类型实际上就是NSMutableString,因为NSString是NSMutableString的父类,这样是没有问题的

总结:

看了这么多那么到底什么时候使用copy什么时候使用strong呢?我的经验是这样的,

参考:

NSString属性什么时候用copy,什么时候用strong?

上一篇下一篇

猜你喜欢

热点阅读