我们在OC中定义变量,可以自己来定义变量的setter方法来设置变量值,用getter方法来获取变量值。但是当变量数量增多时,还采用手动添加setter/getter方法来操作变量,就会使得程序代码量大大增加。幸好从OC 2.0开始,我们能让系统自动生成设置变量值的方法或获取变量值的方法,即系统会自动为我们生成setter/getter方法。这中功能减少了代码量,让我们有更多的精力放在程序的业务逻辑上。为了使设置变量值的功能更加完善,OC使用@property来标识属性。例如变量可分为只读变量,那么变量的属性为readonly。其中有些属性比较好区分,但还有一些属性assign、copy等属性却让人有些困惑。

先说说采用@property的语法吧!变量的声明语法为:

@property(attribution)Vartype  Varname;//属性在()里来定义,然后是变量类型、变量名。

OC提供的属性有:

读写属性: (readwrite/readonly)以及(getter=name)、(setter=name)

setter语意:(assign/retain/copy)

原子性: (non)atomic

提醒一下,采用@property与自定义setter和getter方式其实是等价的,但是编译器会优先查找自动的setter/getter方法,如果找不到,就会使用@property对应的属性。例如:

@propert(nonatomic ,copy)NSString *name;

这条语句等价于:

完成setter方法为:

-(void)setName:(NSString*)newName{

if(newName!=name){

[name release];

name=[newName  copy];

}

}

完成getter方法为:

-(NSString*)name{

return name;

}

下面详细来说明这些属性的差异

读写属性中,readwrite可以获取实例变量的值。对于@synthesize,编译器会自动为该变量生成getter和setter方法。而readonly表示只读变量,不能设置实例变量的值,编译器不会为其生成setter方法,因此需要进行初始化。而getter/setter=name,是为(getter)/(setter)方法使用name指定的名称,而不是实例变量名称。

setter语意assign/retain/copy 决定了以何种方式对数据成员赋予新值。对于Objective-C中的一般object,最好使用用retain。一些特别的object(例如:string)使用copy。

而assign关键字代表setter直接赋值,而不是复制或者保留它,更不需要进行引用计数。这种机制非常适合一些基本数据类型,比如NSInteger和CGFloat,或者你并不直接拥有的类型,比如delegates((且一定要用assign,具体原因暂时不知道,读者看到这里可以留言给我,告诉我答案)。

这里声明一下,什么是基本基本类型呢? 基本类型就是gc(gc就是垃圾回收的意思)队形,并且只有基本数据类型是gc对象,其它都是非gc的。比如int,float等基本数据类型。而NSString是非gc类型,所以用assign就不适合,而推荐做法是NSString用copy。而类如NSArray,NSDate等其它objc类型,推荐用retain。

而copy与retain的具体区别为:copy其实是建立了一个相同的对象,而retain只是保存其对象,并且其计数值+1。
例如:一个NSString对象,地址为0×1000,内容为@”string” 
copy到另外一个NSString之后,地址为0×2000,内容相同,新的对象retain为1,旧有对象没有变化 
retain到另外一个NSString之后,地址相同(建立一个指针,指针拷贝),内容当然相同,但是这个新对象的retain值+1,并释放旧的对象。
也就是说,retain是指针拷贝,copy是内容拷贝。 

atomicity的默认值是atomic,读取函数为原子操作。atomic是保证读取变量是线程安全的,即它会保证每次getter和setter的操作都会正确的执行完毕,而不用担心其它线程在你get的时候set,可以说保证了某种程度上的线程安全而nonatomic是不能保证线程安全的。但是nonatomic比atomic速度要快。这也是为什么property基本上都用nonatomic了。 最后加上一句,仅仅靠atomic来保证线程安全是不可能的,要写出线程安全的代码,还是需要有同步和互斥机制

注意:

       1.readonly关键字代表setter不会被生成, 所以它不可以和 copy/retain/assign组合使用。

2.默认的property行为有:atomic,assign,readwrite。

如果这样使用:@property  BOOL _flag;//代表这_flag有着atomic,assign,readwrite三种行为。所以我们一定要提防这种默认行为潜在的危险。如:

@property NSMutableArray *photoViews;//此时会有警告出现,因为NSMutableArray是一种obj类型,并且是 NSArray类型,根据前面的分析,最好采用retain。所以默认的assign会带来警告提示。

关于属性方面的知识还可以参考:http://www.cnblogs.com/andyque/archive/2011/08/03/2125728.html

Objective-C中变量采用@property的各个属性值的含义

 

Objective-C中变量采用@property的各个属性值的含义的更多相关文章

  1. 清除bean中所有非基本数据类型的属性值

    利用beanutils清除javabean中所有非基本数据类型的属性值: import com.google.gson.Gson; import lombok.Data; import org.apa ...

  2. Format a Property Value 设置属性值的格式

    In this lesson, you will learn how to set a display format and an edit mask to a business class prop ...

  3. java中两个对象间的属性值复制,比较,转为map方法实现

    package com.franson.study.util; import java.lang.reflect.InvocationTargetException; import java.lang ...

  4. jsp中<c:forEach varStatus="status">的属性值问题

    c:forEach varStatus属性 current当前这次迭代的(集合中的)项 index当前这次迭代从 0 开始的迭代索引 count当前这次迭代从 1 开始的迭代计数 first用来表明当 ...

  5. PHP中使用DOM读取解析XML属性值一例

    先看XML文件结构,与常见的文件略有不同,数据并不是用闭合标签保存的,而是直接保存在属性值中. <?xml version="1.0" encoding="utf- ...

  6. SpringBoot 从application.yml中通过@Value读取不到属性值

    package cn.exrick.xboot.mqtt; import org.eclipse.paho.client.mqttv3.*;import org.eclipse.paho.client ...

  7. html中的meta元素及viewport属性值

    <meta name="viewport" content="width=device-width , initial-scale=1.0, maximum-sca ...

  8. Stringboot中@Autowired加了static就属性值就为null

    //错误 @Autowired private static DepartmentDao departmentDao; @Autowired注入,将bean注入进来 @Autowired通过sprin ...

  9. python小知识-__call__和类装饰器的结合使用,数据描述符__get__\__set__\__delete__(描述符类是Python中一种用于储存类属性值的对象)

    class Decorator(): def __init__(self, f): print('run in init......') self.f = f def __call__(self, a ...

随机推荐

  1. BaseBean构造

    package cn.jsonlu.passguard.model; import cn.jsonlu.passguard.utils.MD5Util; import com.fasterxml.ja ...

  2. "javascript:void(0)"用法

    1.window.open(''url'') 2.用自定义函数 <script> function openWin(tag,obj) { obj.target="_blank&q ...

  3. jQuery选择器部分知识点总结

    一.jQuery选择器的优势 1.使用CSS选择器时,开发人员需要考虑主流浏览器是否支持某些选择器,而在jQuery中,开发人员则可以放心的使用jQuery选择器而无需考虑浏览器是否支持这些选择器. ...

  4. emmt html生成

    html:5  或 ! html:5 或!:用于HTML5文档类型 html:xt:用于XHTML过渡文档类型 html:4s:用于HTML4严格文档类型 常用过渡文档类型  html:xt  直接c ...

  5. 【USACO 1.4.4】母亲的牛奶

    [题目描述]  农民约翰有三个容量分别是A,B,C升的桶,A,B,C分别是三个从1到20的整数, 最初,A和B桶都是空的,而C桶是装满牛奶的.有时,约翰把牛奶从一个桶倒到另一个桶中,直到被灌桶装满或原 ...

  6. IE layout详解

    引言: Internet Explorer 中有很多奇怪的渲染问题可以给他一个”layout”得到解决,John Gallant 和 Holly Bergevin把他归类为“dimensional b ...

  7. Python新手学习基础之数据结构-序列1

    序列概念 序列,顾名思义就是有顺序的列,在Python里序列类型的数据结构包括字符串,列表和元组.既然都是序列类型,说明他们有很多共通点,他们的每一个元素都可以通过指定的偏移量方式(索引操作)来获得, ...

  8. powerpoint取色器有什么用|ppt取色器使用教程

    在使用powerpoint过程中常常发现一些功能我们很少用到,其实是自己不会用的原因,关于powerpoint取色器有什么用呢?接下来我们一起来学一下ppt取色器使用教程. powerpoint取色器 ...

  9. bind函数

    bind函数把一个本地协议地址赋予一个套接字 对于网际协议,协议地址是32位的IPv4地址或128位的IPv6与16位的TCP或UDP端口号的组合 int bind ( int sockfd, con ...

  10. 新建PCH文件以及常用宏定义

    $(SRCROOT)/项目名/pch文件名.pch //0-255的随机数 #define randint arc4random() % 256 //随机色 #define randColor [UI ...