* assign
设置方法只会执行针对“纯量类型” 的简单赋值操作,如CGFloat,NSInteger
* strong
此特质表明该属性定义了一种“拥有关系”,为这种属性设置新值时,设置方法会先保留新值,并释放旧值,然后再将新值设置上去。
* copy
此特质所表达的所属关系与strong类似。然而设置方法并不保留新值,而是将其‘拷贝’。当属性类型是NSString *时,经常用此特d质来保护其封装性,因为传递给设置方法的新值有可能指向一个NSMutableString类的实例,这个类是NSString的子类,表示一种可以修改其值的字符串,此时若是不拷贝字符串,那么设置完属性之后,字符串的值就可能会在对象不知情的情况下遭人更改。所以,这时就要拷贝一份“不可变”的字符串,确保对象中的字符串值不会无意间变动。
只要实现属性所用的对象是“可变的”,就应该在设置新属性值时拷贝一份。
Objective-C默认声明的一个对象就为__strong
在强引用中,有时会出现循环引用的情况,这时就需要弱引用来帮忙(__weak)。
强引用持有对象,弱引用不持有对象。
* weak和strong 用来修饰属性如 @property (nonatomic, weak) NSString *name;
* __weak 和 __strong 用来修饰变量
weak 与assign 区别
##### @property (nonatomic, weak) id delegate;
##### @property (nonatomic, assign)id delegate;
*weak 和 assign* 是一种“非拥有关系”的指针,通过这两种修饰符修饰的指针变量,都不会改变被引用对象的引用计数。但是在一个对象被释放后,weak 会自动将指针指向 nil,而 assign 则不会。 在 iOS 中,向 nil 发送消息时不会崩溃的,但是 assign 就会导致野指针的错误 unrecoginzed selector sent to instance.
所以我们如果修饰代理属性,还是用weak 修饰吧,比较安全。
typedef void (^selectedCell) (NSIndexPath * indedxpath);
##### *delegate 和 block 的选择:*
1.多个消息传递,应该使用delegate
2.一个委托对象的代理属性只能有一个代理对象
3.单例对象最好不要用delegate
单例对象由于始终都是同一个对象,如果使用delegate,就会造成我们上面说的delegate属性被重新赋值的问题,最终只能有一个对象可以正常响应代理方法。
* ######代理更加面向过程,block则更面向结果。
比如网络请求回来,通过success/failure 代码块来展示比较好
* ###### 从性能上说,block的性能消耗要略大于delegate,因为block会涉及到 栈区向堆区拷贝等操作,时间和空间上的消耗都大于代理。而代理只是定义了一个方法列表,在遵守协议对象的objc_protocol_list 中添加一个节点,在运行时向遵守协议的对象发送消息即可。