如何把uiview中所有的subview全部清除掉

chilli6519 2014-09-22 03:12:30

最好是能够彻底的释放内存

用subviews的removeall方法出错

...全文
6571 9 打赏 收藏 转发到动态 举报
写回复
用AI写文章
9 条回复
切换为时间正序
请发表友善的回复…
发表回复
倪灏 2016-01-14
  • 打赏
  • 举报
回复
[self.subviews makeObjectsPerformSelector:@selector(removeFromSuperview)]
Bannings 2014-09-22
  • 打赏
  • 举报
回复
引用 7 楼 chilli6519 的回复:
[quote=引用 6 楼 zhangao0086 的回复:] 你甚至可以写得更加详细: self.view.subviews.map( {(subview: AnyObject) -> AnyObject in if subview.isKindOfClass(UIImageView) { subview.removeFromSuperview() } return subview }) Swift入门易,精通难
说的太对了, 想往深了折腾,越来越糊涂了[/quote] 我在Swift区开了个贴子,贴出了一些我常用的Swift站点,你可以参考一下
chilli6519 2014-09-22
  • 打赏
  • 举报
回复
引用 6 楼 zhangao0086 的回复:
你甚至可以写得更加详细: self.view.subviews.map( {(subview: AnyObject) -> AnyObject in if subview.isKindOfClass(UIImageView) { subview.removeFromSuperview() } return subview }) Swift入门易,精通难
说的太对了, 想往深了折腾,越来越糊涂了
Bannings 2014-09-22
  • 打赏
  • 举报
回复
你甚至可以写得更加详细: self.view.subviews.map( {(subview: AnyObject) -> AnyObject in if subview.isKindOfClass(UIImageView) { subview.removeFromSuperview() } return subview }) Swift入门易,精通难
Bannings 2014-09-22
  • 打赏
  • 举报
回复
首先这句话用到了尾随闭包语法,正常写法是: self.view.subviews.map ( { $0.removeFromSuperview() } ) map是swift array的一个方法,使用它的前提是你的数组是一个泛型数组(每一个元素都是同样的类型),它的返回值是一个新的数组,作用是对其中的每个元素执行某种操作,$0相当于是语法,表示当前执行的元素 详细说明见官方文档:https://developer.apple.com/library/ios/documentation/General/Reference/SwiftStandardLibraryReference/Array.html
chilli6519 2014-09-22
  • 打赏
  • 举报
回复
引用 3 楼 zhangao0086 的回复:
是的,removeFromSuperview本意是为了将view从视图层级上删除,但是ARC是在对象的引用计数为0时释放对象占用的内存,如果你没有任何强引用指向其中的子视图,那么在removeFromSuperview调用之后,视图层级上没有了子视图的引用,即self.view不再持有子视图的强引用,那么子视图就会被释放掉。 可以说removeFromSuperview并不涉及内存管理的问题,如果有内存泄漏,那肯定是自己的逻辑代码有问题
谢谢 没有理解这句意思,特别是其中的 $0 这个 self.view.subviews.map{ $0.removeFromSuperview()} 那如果我希望把subview中的某中类型的全部remove 呢?
Bannings 2014-09-22
  • 打赏
  • 举报
回复
引用 2 楼 chilli6519 的回复:
[quote=引用 1 楼 zhangao0086 的回复:] 就算不报错你这么做也是不对的,因为视图是被添加到window上的,数组只是一个引用,关键是对子视图调用removeFromSuperview方法: self.view.subviews.map{ $0.removeFromSuperview()}
但我在其他资料上好像看到 removeFromSuperview 只是从view上将层次剔除了, 并没有释放内存, 通过运行时内存监测好像也确实没有减少[/quote] 是的,removeFromSuperview本意是为了将view从视图层级上删除,但是ARC是在对象的引用计数为0时释放对象占用的内存,如果你没有任何强引用指向其中的子视图,那么在removeFromSuperview调用之后,视图层级上没有了子视图的引用,即self.view不再持有子视图的强引用,那么子视图就会被释放掉。 可以说removeFromSuperview并不涉及内存管理的问题,如果有内存泄漏,那肯定是自己的逻辑代码有问题
chilli6519 2014-09-22
  • 打赏
  • 举报
回复
引用 1 楼 zhangao0086 的回复:
就算不报错你这么做也是不对的,因为视图是被添加到window上的,数组只是一个引用,关键是对子视图调用removeFromSuperview方法: self.view.subviews.map{ $0.removeFromSuperview()}
但我在其他资料上好像看到 removeFromSuperview 只是从view上将层次剔除了, 并没有释放内存, 通过运行时内存监测好像也确实没有减少
Bannings 2014-09-22
  • 打赏
  • 举报
回复
就算不报错你这么做也是不对的,因为视图是被添加到window上的,数组只是一个引用,关键是对子视图调用removeFromSuperview方法: self.view.subviews.map{ $0.removeFromSuperview()}

1,420

社区成员

发帖
与我相关
我的任务
社区描述
Swift,苹果于2014年WWDC(苹果开发者大会)发布的新开发语言,可与Objective-C共同运行于MAC OS和iOS平台,用于搭建基于苹果平台的应用程序。
swift 技术论坛(原bbs)
社区管理员
  • Swift
  • 网罗开发
  • 大熊猫侯佩
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧