总是忘记,索性记下来。也都是copy别人的。
(weak和strong)不同的是 当一个对象不再有strong类型的指针指向它的时候 它会被释放 ,即使还有weak型指针指向它。
一旦最后一个strong型指针离去 ,这个对象将被释放,所有剩余的weak型指针都将被清除。
可能有个例子形容是妥当的。
想象我们的对象是一条狗,狗想要跑掉(被释放)。
strong型指针就像是栓住的狗。只要你用牵绳挂住狗,狗就不会跑掉。如果有5个人牵着一条狗(5个strong型指针指向1个对象),除非5个牵绳都脱落 ,否着狗是不会跑掉的。
weak型指针就像是一个小孩指着狗喊到:“看!一只狗在那” 只要狗一直被栓着,小孩就能看到狗,(weak指针)会一直指向它。只要狗的牵绳脱落,狗就会跑掉,不管有多少小孩在看着它。
只要最后一个strong型指针不再指向对象,那么对象就会被释放,同时所有的weak型指针都将会被清除。
例子:
#import <UIKit/UIKit.h>
NS_ASSUME_NONNULL_BEGIN
@protocol DCDatePickerDelegate <NSObject>
@optional
//当UIDatePicker值变化时所用到的代理
- (void)picker:(UIDatePicker *)picker ValueChanged:(NSDate *)date;
@end
@interface DCDatePicker : UIView
@property (nonatomic, weak)id<DCDatePickerDelegate> delegate;
@property (nonatomic, strong) UIDatePicker *datepicker;
@property (nonatomic, strong) UIButton *cancelButton;
@property (nonatomic, strong) UIButton *okButton;
@end
NS_ASSUME_NONNULL_END
看上边一段代码 属性有weak的delegate,还有strong的控件button(button是手动创建的控件,没有xib来strong它。)。
可以这么理解:
我只要这个DCDatePicker 视图也就是一个页面,还在没有会被回收,那么这几个strong的控件就必须都在。
而那个weak的delegate,我不管你,即使我的这个视图还没被回收,你这个delegate想要回收也是可以的。
所以在DCDatePicker 在用delegate的时候要先判断你要用的方法在不在。
另外weak也是防止strong死锁不放,导致内存泄露的。从网上弄了两张图便于理解。
对象之间的强引用关系可能造成一个强引用循环,比如table view 类和它的delegate 之间的关系
这种情况下如果other objects都被释放掉,NSTableView 和Delegate Object也不会被释放,因为他们彼此保持强引用,不会被当作垃圾回收
避免强引用循环的解决方案是使用weak关键字,声明弱引用
这种情况下,NSTableView对Delegate Object弱引用,当引用Other Objects被释放掉后,Delegate Object没有其他对象对其强引用了,因此Delegate Object被释放,然后NSTableView也会被释放