Object-c @Property

和自甴很熟 提交于 2020-01-07 16:27:58

【推荐】2019 Java 开发者跳槽指南.pdf(吐血整理) >>>

http://blog.csdn.net/dqjyong/article/details/7668601(原博客)

以下是对原博客的整理

导航:

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

setter语意:(assign/retain/copy)

原子性: (non)atomic

从OC 2.0开始,我们能让系统自动生成设置变量值的方法或获取变量值的方法,即系统会自动为我们生成setter/getter方法。

@property(attribution)Vartype  Varname;

Setter and Getter

提醒一下,采用@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;

        }

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

Readonly

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

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

Assign

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

Retain

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

Retain和Copy对比

而copy与retain的具体区别为:copy其实是建立了一个相同的对象,而retain只是保存其对象,并且其计数值+1。

例如:一个NSString对象,地址为0×1000,内容为@”string” 

copy到另外一个NSString之后,地址为0×2000,内容相同,新的对象retain为1,旧有对象没有变化 

retain到另外一个NSString之后,地址相同(建立一个指针,指针拷贝),内容当然相同,但是这个新对象的retain值+1,并释放旧的对象。

也就是说,retain是指针拷贝,copy是内容拷贝。 

Atomic

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

P:注意

       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会带来警告提示。


易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!