iOS 在aView上添加bView的问题

李远超 发布于 2013/04/22 10:01
阅读 1K+
收藏 0

大家好!

    想讨论个问题,我说说我的理解,大家来看看是不是这样,谢谢

    在aView上添加bView

    UIView *bView = [[UIView alloc] init];

    ..........

    [aView addSubView:bView];

    [bView release];

    for (int i = 0; i < 10; i++) {

           [aView addSubView:bView];

    }

    这样做有没有问题?会不会产生内存泄露的问题?有没有必要在每次add之前做一次removeFromSuperView?

    如果现在有个另外一个cView。我再执行

    [cView addSubView:bView];

    这样呢?有没有必要做removeFromSuperView操作?


    我举个生活中的例子吧!

    aView 就像一个杯子,bView就像杯子中的一个勺子。

    我每次执行add操做,就相当与把勺子从杯子中拿出来在放回去。

    那么[cView addSubView:bView];就相当于把勺子从杯子中拿出来放到另外一个缸子里面一样。

    所以我觉得没有必要做remove操作。

    以上是我的理解,请大神们给出宝贵意见,谢谢! 




加载中
0
Railgun
Railgun

仔细看看官方文档的这一段:

If view already has a superview and that view is not the receiver, this method removes the previous superview before making the receiver its new superview.
在addSubview:的时候,如果这个subview有了superview,而且这个superview不是call  addSubview:方法的对象,那addSubview会自动执行subview的removeFormSuperview的方法。

是否会产生内存泄露只要用Instruments实际测试一下就知道了。

根据“谁申请,谁负责”的原则,只要你保证你的alloc、retain、copy操作都有release,那就不会产生内存泄露。UIView的addSubview产生的retain,由UIView自己负责,我们不需要操心。

李远超
李远超
回复 @Railgun : 但是如果勺子已经在你要放的杯子里,系统就不会再把那个勺子拿出来了--->意思就是说,如果我想把勺子放入杯子中(其实这个时候勺子已经在杯子中了),系统就不会做任何操作了(把勺子拿出来再放进去),对吧?
Railgun
Railgun
回复 @李远超 : 嗯,系统会自动调用removeFromSuperview;但是如果勺子已经在你要放的杯子里,系统就不会再把那个勺子拿出来了。
李远超
李远超
回复 @Railgun : 你说的就会调用也是系统自动调用的嘛?如果是,那就是说不管它原有的superView是不是这次call addSubView:方法的对象,subView都会自动执行它的removeFromSuperView方法了?也就是我说的那个生活中的例子是没问题的了?勺子就一把,重复放入杯子里,系统的操作就是拿出杯子里的勺子,在放入杯子中,对吧?谢谢
Railgun
Railgun
回复 @李远超 : 如果 这个superview不是call addSubview:方法的对象 会怎么样呢?-->如果是这种情况,就会调用subview的removeFromSuperview,先把subview从之前的superview上移除。再把subview加到调用addSubview方法的UIView里。
李远超
李远超
非常感谢你的回答,我也感到快要明白了。但是好像还差一点,就是如果 这个superview不是call addSubview:方法的对象 会怎么样呢?你可能会问我为什么要多次将bView加到aView上呢?我遇到了这样的情况,就是三个button,每点击一个button就将对应的View加到父view上,那么就会出现了重复添加的情况,所以我才有了这些疑问。谢谢你的回答。
下一页
0
xoHome
xoHome

需要remove

李远超
李远超
回复 @xoHome : 没有错啊
xoHome
xoHome
回复 @李远超 : 你这么操作不会出错么? 我之前也这么操作过 是会报错的
李远超
李远超
你好,谢谢你的恢复,能麻烦说一说为什么需要remove嘛?如果我不remove会怎么样?有什么后果?
0
dake
dake

有必要在每次add之前做一次removeFromSuperView

当然..如果最后aView被release的时候..不管你有没有对bView removeFromSuperView...都不会有内存泄漏..

李远超
李远超
非常感谢你的回答,但是你也看到了,楼下的回答好像更专业,咱们都共同学习吧!所以我可能设他为最佳答案,理解了。谢谢
dake
dake
回复 @李远超 : 你说的效果是这么理解不错..但是..从代码可读性和内存管理原则来讲...你最好还是显式地remove一下...这样比较合理..
李远超
李远超
回复 @dake : 也就是说我的观点没问题,对吗?没有必要做remove操作,对吗?因为remove是不是就相当于从集合中移除?
dake
dake
回复 @李远超 : soga...明白 了....subview是一个NSMutableArray....往里面重复add同一个对象不会重复retain..相当于无效操作..
李远超
李远超
回复 @dake : 可是我输出了retainCount值,它并没有增加。另外,我在for循环中,改变bView的Frame,我看不到之前的bView。
下一页
返回顶部
顶部