本帖最后由 Simpon 于 2016-10-27 10:31 编辑
前文说道:关于属性的创建以及部分关键字的解释与区别,进行了一定程度上的解释。 具体可以查看: 本文会继续阐述一些跟属性关键字有关的一些技术点。
一、@synthesize 和 @dynamic 分别有什么作用
@property 有两个对应的词,一个是@synthesize,一个是@dynamic。 如果@synthesize 和@dynamic 都没写,那么默认的就是 二、ARC 下,不显式指定任何属性关键字时,默认的关键字都有哪些?
三、@synthesize 合成实例变量的规则是什么?假如 property 名为 foo,存在一个名为_foo 的实例变量,那么还会自动合成新变量么?
先回答第二个问题:不会!!!不会!!!不会!!!
四、在有了自动合成属性实例变量之后,@synthesize 还有哪些使用场景?
首先的搞清楚什么情况下不会 autosynthesis(自动合成): - 同时重写了 setter 和 getter 时
- 重写了只读属性的 getter 时
- 使用了@dynamic 时
五、怎么用 copy 关键字?
NSString、NSArray、NSDictionary 等等经常使用 copy 关键字,是因为他们有对应的可变类型:NSMutableString、NSMutableArray、NSMutableDictionary. 为确保对象中的属性值不会无意间变动,应该在设置新属性值时拷贝一份,保护其封装性block,也经常使用 copy,关键字block。
六、用@property 声明的 NSString(或 NSArray,NSDictionary)经常使用 copy 关键字,为什么?如果改用 strong 关键字,可能造成什么问题?
因为父类指针可以指向子类对象,使用 copy 的目的是为了让本对象的属性不受外界影响,使用 copy 无论给我传入是一个可变对象还是不可对象,我本身持有的就是一个不可变的副本. 如果我们使用是 strong,那么这个属性就有可能指向一个可变对象,如果这个可变对象在外部被修改了,那么会影响该属性.
复制详解:
这里需要注意的是集合对象的内容复制仅限于对象本身,对象元素仍然是指针复制。
七、这个写法会出什么问题: @property(copy)NSMutableArray *array;
因为 copy 策略拷贝出来的是一个不可变对象,然而却把它当成可变对象使用,很容易造成程序奔溃这里还有一个问题,该属性使用了同步锁,会在创建时生成一些额外的代码用于帮助编写多线程程序,这会带来性能问题,通过声明 nonatomic 可以节省这些虽然 很小但是不必要额外开销,在 iOS 开发中应该使用 nonatomic 替代 atomic.
八、如何让自定义类可以用 copy 修饰符?如何重写带 copy 关键字的 setter?
若想令自己所写的对象具有拷贝功能,则需实现 NSCopying 协议。如果自定义的对象分为可变版本与不可变版本,那么就要同时实现 NSCopyiog 与NSMutableCopying 协议,不过一般没什么必要,实现 NSCopying 协议就够了
对于属性关键字的总结,暂时先整理这么多,如果有一些问题,希望同学问及时提出来,我们的老师会第一时间为你们解答的。
精华推荐: |