UIView 使用weak、strong的区别

UIView 使用weak、strong的区别

作者:shopping627
链接:https://www.jianshu.com/p/c8495b2cc772

weak、strong最大区别在于 removeFromSuperview这个方法:

weak在父view中持有的计数器为1,即superview

strong在父view中持有的计数器为2,即superview 和 strong属性

因此,当调用removeFromSuperview时,weak所引用的计数器为0,view会被释放,而strong view则不会。在业务中,如果把view移除了,又要加回来的,应该使用strong view,weak view 的优势在于可以及时释放内存。


作者:shopping627
链接:https://www.jianshu.com/p/c8495b2cc772

 

iOS weak和assign修饰OC对象的区别

/*
 1.weak
 1> OC对象

 2.assign
 1> 基本数据类型
 2> OC对象

 3.strong
 1> OC对象

 4.copy
 1> NSString
 2> block

 5.使用weak和assign修饰OC对象的区别
 1> 成员变量
 1) weak生成的成员变量是用__weak修饰的,比如Cat * __weak _cat;
 2) assign生成的成员变量是用__unsafe_unretained修饰的Cat * __unsafe_unretained _cat;

 2> __weak和__unsafe_unretained
 1) 都不是强指针(不是强引用),不能保住对象的命
 2) __weak : 所指向的对象销毁后,会自动变成nil指针(空指针),不再指向已经销毁的对象
 3) __unsafe_unretained : 所指向的对象销毁后,仍旧指向已经销毁的对象
 */



原文:https://blog.csdn.net/cjlcooper/article/details/53526505 

所以在这种情况下,其实 UI 控件是不是 weak 其实关系并不大。当 UI 控件是 weak 时,它的引用计数是 1,持有它的是它的 superview,当 UI 控件是 strong 时,它的引用计数是 2,持有它的有两个地方,一个是它的 superview,另一个是这个 strong 的指针。UI 控件并不会持有别的对象,所以,不管是手写代码还是 Storyboard,UI 控件是 strong 都不会有循环引用的。


那么回到我们的最初的问题,自己写的 view 成员,应该用 weak 还是 strong?我个人觉得应该用 strong,因为用 weak 并没有什么特别的优势,加上上一篇面试题文章中,我们还看到,其实 weak 变量会有额外的系统维护开销的,如果你没有使用它的特别的理由,那么用 strong 的话应该更好。


另外有读者也提到,如果你要做 Lazy 加载,那么你也只能选择用 strong。


当然,如果你非要用 weak,其实也没什么问题,只需要注意在赋值前,先把这个对象用 addSubView 加到父 view 上,否则可能刚刚创建完,它就被释放了。

 

对于控件是用 weak 还是用 strong ?

  https://www.jianshu.com/p/168ebbe66c92

缘由: 今天在看项目的时候,发现其中一同事,将所有控件的属性都设置为weak,而我自己想想我平常基本都是用 strong啊,当然 XIB 或 stroyboard 例外,所以特此多加了解下。

回顾下,我们控件一般是怎样创建的呢?
1、 从storyboard或者xib创建

@property (weak, nonatomic) IBOutlet UIScrollView *myScrollerView;

从storyboard或者xib创建为什么用 weak? 注意控件在 View 上时,它们已经形成的引用关系:

UIViewController => UIView => subView => myScrollerView

此时就相当于 XIB 对其已经强引用啦,所以你你声明的属性对它是弱引用。另外我觉的下面这句话,非常到位。因为控件他爹( view.superview )已经揪着它的小辫了( strong reference ),你( viewController )眼瞅着( weak reference )就好了。

总之,设为weak是因为它已经被view引用了,除非view被释放,否则IBOutlet的属性也不会被释放,另外IBOutlet属性的生命周期和view应该是一致的,所以IBOutlet属性一般设为weak。

2、 手动创建并声明strong或者weak

@property (nonatomic, strong) UIButton *testButton;
@property (nonatomic, weak) UILabel *testLabel;

我是一般用 strong,我们再观察下,下面两种的实际用法

// strong
self.testButton = [UIButton buttonWithType:UIButtonTypeCustom];
[self.view addSubview:self.testButton];

// weak    
UILabel *label = [[UILabel alloc] init];
self.testLabel = label;
[self.view addSubview:self.testLabel];

其实不管声明的属性是强引用还是弱引用,在控制器消失的时候,这个属性消失,View消失,subViews消失,控件也就消失了。

在手动创建的时候,使用 weak并没有什么特殊的优势,相反这块不注意写法的话,还容易对象会因无引用者立即被释放,造成问题。
另外注意一原则:UIViewController下的view,由于viewcontroller直接拥有该view,那就应该选择strong。而如果控件是viewcontroller中view的子视图,对于这个子视图,它的所有者是它的父视图,代码中只是想引用一下这个子视图的指针而已,那么就应该选择weak。

所以我们手动创建这块,对于控件使用还是用 strong 吧

 

posted on 2019-04-02 11:30  鬼手渔翁  阅读(656)  评论(0)    收藏  举报

导航