前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >重读OC属性声明

重读OC属性声明

作者头像
大话swift
修改2019-10-09 15:12:08
6990
修改2019-10-09 15:12:08
举报
文章被收录于专栏:大话swift大话swift
Writability

下面的两个属性决定属性的的访问权限

readonly

表明属性是只读,只需要提供getter函数即可。但是假如你还提供@synthesize那么只有getter方法是synthesized

readwrite

表明声明的属性是read/write的,可读也可写。这个属性默认直接提供getter和setter。同时假如你提供了@synthesize那么getter/setter同时是synthesized

总结:无论是默认getter还是默认setter要想线程安全据需要使用@synthesize
Setter Semantics(setter讲义)

下面的一系列属性控制都是互斥的

strong

strong对于被声明的变量声明一种强的从属(owning)关联关系

weak

weak对于被声明的属性声明了一种非从属(non-owning)关系.

加入主被释放,那么weak声明的会被自动设置为nil(OSv10.6/iOS4之后,采用assign替代)

copy

表明被copy的object是被用于赋值的

对被copy的主体发送一个release消息

对于被声明copy的属性会触发一个copy方法。此属性只适合class类型的,并且还必须组训NSCopying协议

assign

作为默认的属性声明,表明这是一个简单的setter赋值

这个属性只针对简单的数据类型,比如NSInteger,CRect

retain

表明在赋值的时候retain应该被调用

对于原有的数据会发送一个release消息

Atomicity

使用nonatomic/atomic表明访问是否是原子性的,在OC中默认采用的原子性

nonatomic

声明为非原子性,多线程访问不安全

默认情况下属性是atomic的,因此在多线程下提供基于getter和setter分别的线程安全访问

假如你提供了strong,copy和retain俺的没也提供nonatomic,然后在引用计数的环境下访问的getter和setter都是基于lock实现的

大概代码如下:

代码语言:javascript
复制
[_internal lock]; // lock using an object-level lock
id result = [[value retain] autorelease];
[_internal unlock];
return result;

https://developer.apple.com/library/archive/documentation/Cocoa/Conceptual/ObjectiveC/Chapters/ocProperties.html#//apple_ref/doc/uid/TP30001163-CH17

关注公众号查看更多
关注公众号查看更多
本文参与 腾讯云自媒体分享计划,分享自微信公众号。
原始发表:2019-09-28,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 大话swift 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • Writability
  • 总结:无论是默认getter还是默认setter要想线程安全据需要使用@synthesize
  • Setter Semantics(setter讲义)
  • Atomicity
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档