在ios开发中weak和strong的使用问题

来源:互联网 发布:淘宝教育是什么 编辑:程序博客网 时间:2024/05/22 06:34
1.控件作为属性时,一般使用weak修饰该属性
在ios中,如果是进行控件开发,那么一般控件作为一个属性变量时,一般都使用weak来修饰
例:

@interface ViewController ()
@property (weak , nonatomic) IBOutlet UITableView *tableView;
@end

在控制器中使用weak修饰的原因是,控制器中有一个view,通过view中的addSubView添加这个tableView已经是强指针引用了,如果再在控制器中使用strong修饰的话,表示这个tableView有两个强指针引用,那么,当tableView调用removeFromSuperView方法时,因为tableView在控制器中还有一个强指针引用,这就导致tableView始终不能被销毁。所以为了避免这种情况,我们将控制器中的直接UI控件属性设置为weak修饰。


如果上面的_tableView属性改为了强指针,那么,当控制器中的UIView移除UITableView时,因为UITableView还存在强指针引用,所以不会被释放空间。



2.在控件中使用代理属性时,这个代理属性必须使用weak修饰
控件中的代理属性必须是weak修饰的,比如UISCrollView或者UITableView中的delegate都是用weak或者assign修饰的。
@property (nonatomic , assign)   id <UITableViewDataSource > dataSource;
@property (nonatomic , assign)   id <UITableViewDelegate >   delegate;

从上面的控件中的UI控件属性变量一般使用weak可知,控制器中的view已经有对UITableView的强指针引用了,如果UITableView中的代理属性也为strong或者retain的话,那么就会出现循环引用了,导致谁也不愿意释放谁,所以为了避免相互引用的情况,控件的代理属性必须要使用weak或者assign修饰(非控件的代理可以用strong)。

如果上面的UITableView控件中的delegate属性是强指针的话,那么因为两边都是strong,就会出现相互引用的情况。


























0 0