A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

本帖最后由 Simpon 于 2016-10-27 10:31 编辑


前文说道:关于属性的创建以及部分关键字的解释与区别,进行了一定程度上的解释。
具体可以查看:
本文会继续阐述一些跟属性关键字有关的一些技术点。

一、@synthesize 和 @dynamic 分别有什么作用

@property 有两个对应的词,一个是@synthesize,一个是@dynamic
如果@synthesize@dynamic 都没写,那么默认的就是
  1. @syntheszie var = _var;
复制代码
游客,如果您要查看本帖隐藏内容请回复
二、ARC 下,不显式指定任何属性关键字时,默认的关键字都有哪些?

基本数据:
游客,如果您要查看本帖隐藏内容请回复
普通的 OC 对象:
游客,如果您要查看本帖隐藏内容请回复

三、@synthesize 合成实例变量的规则是什么?假如 property 名为 foo,存在一个名为_foo 的实例变量,那么还会自动合成新变量么?

先回答第二个问题:不会!!!不会!!!不会!!!
游客,如果您要查看本帖隐藏内容请回复

四、在有了自动合成属性实例变量之后,@synthesize 还有哪些使用场景?

首先的搞清楚什么情况下不会 autosynthesis(自动合成):
  • 同时重写了 setter 和 getter 时
  • 重写了只读属性的 getter 时
  • 使用了@dynamic

游客,如果您要查看本帖隐藏内容请回复

五、怎么用 copy 关键字?

NSStringNSArrayNSDictionary 等等经常使用 copy 关键字,是因为他们有对应的可变类型:NSMutableStringNSMutableArrayNSMutableDictionary.
为确保对象中的属性值不会无意间变动,应该在设置新属性值时拷贝一份,保护其封装性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 协议。如果自定义的对象分为可变版本与不可变版本,那么就要同时实现 NSCopyiogNSMutableCopying 协议,不过一般没什么必要,实现 NSCopying 协议就够了
游客,如果您要查看本帖隐藏内容请回复

对于属性关键字的总结,暂时先整理这么多,如果有一些问题,希望同学问及时提出来,我们的老师会第一时间为你们解答的。

精华推荐:

52 个回复

倒序浏览
看中了一部分,没记全,用的时候再记
回复 使用道具 举报
lvdong22 发表于 2016-5-12 23:15
看中了一部分,没记全,用的时候再记

多实践就好了
回复 使用道具 举报
iOS技术分享】关于属性关键字,你又知道多少?(下)
回复 使用道具 举报
好厉害好厉害好厉害
回复 使用道具 举报
谢谢楼主
回复 使用道具 举报
楼主强强强
回复 使用道具 举报
这个真是太好了,偷偷的留下了  
回复 使用道具 举报
Simpon 中级黑马 2016-5-18 17:42:31
9#
1871037345 发表于 2016-5-18 17:16
这个真是太好了,偷偷的留下了

那你一定悄悄的 大声告诉别人啊
回复 使用道具 举报
还没有学到哪里,先预习预习```
回复 使用道具 举报
学习学习
回复 使用道具 举报
@property是干什么的。
回复 使用道具 举报
继续看下文,学习下
回复 使用道具 举报
哈哈哈哈哈哈哈哈哈哈哈哈哈
回复 使用道具 举报
谢谢分享
回复 使用道具 举报
如获至宝,非常感谢
回复 使用道具 举报
66666666666
回复 使用道具 举报
只是来学习的
回复 使用道具 举报
学习一下
回复 使用道具 举报
厉害了 我的鸽
回复 使用道具 举报
123下一页
您需要登录后才可以回帖 登录 | 加入黑马