@property的属性参数
来源:互联网 发布:北京网络监控安装 编辑:程序博客网 时间:2024/05/16 06:12
属性参数的分类:1读写属性(readwrite/readonly)2内存管理(assign/retain/copy)(strong)3.原子性(atomicity/nonatomic)
1.读写属性
readwrite 可以读写,就有setter又有getter , readonly只有getter“没有setter”
2.内存管理
(1)assign 使用范围:非NSObject子类对象,基本数据类型如 NSinteger、CGfloat、int、char等
内存计数:直接赋值,retaincount不改变
(2)retain 使用范围: 只适用于NSObject对象,不适用于基本类型和corefoundation(一组c语言接口)因为这两种类型没有retaincount
内存计数:retaincount + 1
赋值时先结后离
- (void)setName:(NSString *)str
{
[str retain];
[name release];
name = str;
}
(3)copy:对象的拷贝,新申请一块内存空间,并把原始内容复制到那片空间.
使用范围: 可变的数据类型(nsmutable), 官方SDK中NSString和NSArray都是用copy,
内存计数:新对象的retaincount为1
一般我们都用strong
3.原子性
nonatomic,非原子性访问,不加同步,多线程并发访问会提高性能。
注意,如果不加此属性,则默认是两个访问方法都为原子型事务访问。锁被加到所属对象实例级。
tomic是Objc使用的一种线程保护技术,基本上来讲,是防止在写未完成的时候被另外一个线程读取,造成数据错误。而这种机制是耗费系统资源的,所 以在iPhone这种小型设备上,如果没有使用多线程间的通讯编程,那么nonatomic是一个非常好的选择。
扩展一下
(1)retain + readonly 一起使用
看官方的SDK 会发现经常 @property(nonatomic,readonly,retain) UIView *contentView;
readonly 就应该已经没有setter的方法何必要加个retain呢
就我理解,readonly其实是有setter方法的(不set 它怎么会有值呢)
而这个setter方法只是在内部使用的外部不能对值进行修改即外部禁止写操作,
所以设置retain有意思的。
详情参考http://www.cocoachina.com/bbs/read.php?tid=91354&keyword=readonly
(2)(官方SDK,对NSString属性的定义都是用copy,而不是retain)
这样写得目的是怕你赋值的是一个MutableString,而MutableString是可变了,如果只是retain,
那么当你在外面改变了这个值的时候,你的属性的值也改变了
- @property的属性参数
- @property 属性参数的意义
- @property属性参数
- 【Objective-C】类的属性、@property参数、前向声明
- iphone的property属性
- ios的@property属性
- android的property属性
- NSArray 的@property属性
- @property的属性
- ios的@property属性
- property 的成员属性
- @property属性的用法
- @property属性的用法
- @property的默认属性
- @property的属性详解
- @property 的属性
- @property的属性
- @property的参数说明
- 调试过程所遇问题汇集
- Apache Struts2高危漏洞 ,站长们行动起来吧!
- autotools工具使用
- Thinking in Java [Java编程机制] 学习笔记 -- List / ArrayList
- linux下 nm 命令
- @property的属性参数
- StringUtils.equals() 用法
- 1396 - Most Distant Point from the Sea
- poj 1195(树状数组)
- strcpy(),memcpy(),memmove(),memset(),strcmp(),strstr()的实现
- PJSIP2.0使用以及交叉编译存在问题解决
- HDOJ 1076 An Easy Task
- JAVA设计模式——单例模式
- volatile关键字的作用