@property 后面的修饰符问题

2016-09-12  本文已影响0人  米撷

ARC下默认的基本类型

@property (atomic, readwrite, assign)

ARC下默认的对象类型

@property  (atomic, readwrite, strong)

1、原子性修饰符 atomic、nonatomic

atomic:线程安全           nonatomic:非线程安全,使用该属性性能会有所提高,一般都使用该属性

2、读写属性修饰符   readwrite、readonly

readwrite:读写操作,系统默认设置getter和setter方法,可以修改

readonly:只读操作,系统只是设置getter方法,只能获取不能修改

3、setter相关修饰符   assign、retain、copy

assign:表示直接赋值,用于基本的数据类型如:NSIntegar、CGFloat。C的数据类型如:float、int、char等。还有id类型

retain:针对对象类型进行内存管理,修饰对象,实现过程(setter方法会先将旧的属性release掉,然后再对新的对象进行一次赋值,并进行一次retain)引用计数会加1

copy:主要修饰NSString类型,表示内容的复制

【当某对象的类具有可修改的子类时,应该将属性设为copy。例如:NSString,NSArray,NSDictionary】

这样做的原因是:如果属性指向的对象的类具有可修改的子类,那个该属性可能会指向可修改的子类对象,同时该子类对象可能会被其他拥有者修改。因此,最好先复制该对象,然后再将属性指向复制后的对象。(编写具有“防御性”的代码)

关于@property后面修饰符的一些问题

1、@property (nonatomic,copy) NSMutableArray *array; 这段代码会有什么问题?

添加,删除,修改数组内的元素的时候,程序会因为找不到对应的方法(unrecognised selector)而崩溃.因为 copy 就是复制一个不可变 NSArray的对象。

应如何修改?

@property (nonatomic,MUtableCopy) NSMutableArray *array;

2、assign与weak,它们都是弱引用声明类型,最大的区别在那呢?

如果用weak声明的变量在栈中就会自动清空,赋值为nil。

如果用assign声明的变量在栈中可能不会自动赋值为nil,就会造成野指针错误!

3、用@property声明的NSString(或NSArray,NSDictionary)经常使用copy关键字,为什么?如果改用strong关键字,可能造成什么问题?

1).因为父类指针可以指向子类对象,使用 copy 的目的是为了让本对象的属性不受外界影响,使用 copy 无论给我传入是一个可变对象还是不可对象,我本身持有的就是一个不可变的副本.

2).如果我们使用是 strong ,那么这个属性就有可能指向一个可变对象,如果这个可变对象在外部被修改了,那么会影响该属性.

copy 此特质所表达的所属关系与 strong 类似。然而设置方法并不保留新值,而是将其“拷贝” (copy)。 当属性类型为 NSString 时,经常用此特质来保护其封装性,因为传递给设置方法的新值有可能指向一个 NSMutableString 类的实例。这个类是 NSString 的子类,表示一种可修改其值的字符串,此时若是不拷贝字符串,那么设置完属性之后,字符串的值就可能会在对象不知情的情况下遭人更改。所以,这时就要拷贝一份“不可变” (immutable)的字符串,确保对象中的字符串值不会无意间变动。只要实现属性所用的对象是“可变的” (mutable),就应该在设置新属性值时拷贝一份。

上一篇 下一篇

猜你喜欢

热点阅读