这样写 iOS 代码到底有问题吗,我总觉得有问题,难道是患上了强迫症?

2016-06-21 16:49:55 +08:00
 hyyy

经常重写 getter 方法,例如这样:

- (UITableView *)tableView {
    if (!_tableView) {
        _tableView = [[UITableView alloc] initWithFrame:CGRectMake(0, 0, kScreenWidth, kScreenHeight) style:UITableViewStyleGrouped];
        _tableView.separatorStyle = UITableViewCellSeparatorStyleNone;
        _tableView.delegate = self;
    }
    return _tableView;
}

我总觉得将 delegate 写在 getter 方法中是一种错误,但找不出理由来,各位大哥能不能告诉我到底对不对,证据在哪,不然我睡不着觉了。。。

4206 次点击
所在节点    程序员
32 条回复
bestkayle
2016-06-21 18:00:22 +08:00
滥用懒加载啊。
zylll520
2016-06-21 18:02:11 +08:00
发现一个奇怪的点 你这个不属于严格意义上的懒加载 而且你这个 tableview 估计是用 strong 来修饰的吧
ostholz
2016-06-21 18:33:39 +08:00
tableView 的 delegate 不会 retain 的. 所以这里是安全的.
zhangchioulin
2016-06-21 19:24:43 +08:00
@ma125125t 对于一开始不显示的控件,使用懒加载降低 cpu 占用
zhangchioulin
2016-06-21 19:25:43 +08:00
@hyyy 使用 _xxxx 并不等于 self.xxxx
zhangchioulin
2016-06-21 19:26:32 +08:00
@hyyy 看错啦 抱歉
qdvictory
2016-06-21 20:12:26 +08:00
不是很建议这样写。在程序上这样写是没有错的,但是使用场景上有可能会出现坑。
getter 方法会被多次调用,如果在方法外设定 self.tableView=nil;那么会造成当前页面存在多个 tableview 。
所以还是比较推荐生成和销毁的执行比为 1:1 来处理。
kera0a
2016-06-21 20:35:57 +08:00
@qdvictory 经典懒加载写法,怎么会有问题。
当你会重新赋值时,那你肯定会在 set 方法里妥善处理旧 tableView 。
另外这种写法,就没打算重新赋值,只是在用的地方(不知道在哪里会先用)直接 self.tableView 就能得到一个对象
Pandara
2016-06-21 20:41:12 +08:00
建议看看 sunnyXX 的 《招聘一个靠谱的 iOS 》跟 chenyilong 的相关解答,里面对这些基础的问题都有很详细的解答
rannie
2016-06-21 21:58:42 +08:00
有很多工程师还推荐这么写的 因为 Xcode 会方便跳到代码块,可以懒加载,而且不用把所有视图都写在一起分别标注, setupUI 的时候 直接 addSubview : self.xxx 就可以,里面都是布局代码而不用关心属性。
564425833
2016-06-22 09:33:37 +08:00
@qdvictory 不是都 if(不存在)才会创建吗,为什么会出现多个呢?
zsading
2016-06-24 09:29:45 +08:00
挺好的, casa 大神也推荐这么写

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/287334

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX