经常重写 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 方法中是一种错误,但找不出理由来,各位大哥能不能告诉我到底对不对,证据在哪,不然我睡不着觉了。。。
1
ma125125t 2016-06-21 16:56:33 +08:00
程序上来说,没什么问题。只不过为什么要把初始化写在 getter 里?统一写在一个 setupUI 里不是更清晰吗?
|
2
lion9527 2016-06-21 16:57:21 +08:00
没什么不对啊。 delegate 跟初始化放一起很正常啊。
|
3
kidneyband 2016-06-21 17:00:29 +08:00
这样写显然对的,一方面一个控件的初始属性写在一起,分块看起来清晰,另一方面, lazyload, self.tableView 点出来的时候必定是有的,不必关系什么时候实例化的问题,再者你发现没有,你可以方便的跳到这个代码块。
至于缺点嘛,稍慢,但我觉得优点多。 |
4
kidneyband 2016-06-21 17:00:49 +08:00
不必关心
|
5
hyyy OP 难道大家都不觉得在 getter 中调用 self 会出问题,难道我真的有强迫症,完啦
|
7
kidneyband 2016-06-21 17:09:46 +08:00
@hyyy 你怀疑会不会出问题是你水平的问题,和这个代码没有关系。
|
8
finab 2016-06-21 17:09:52 +08:00 via iPhone
self 出什么问题? objc 的 getter 就是个普通方法。
|
9
a412739861 2016-06-21 17:14:06 +08:00
没什么问题吧,就是一般如果这个 tableview 是肯定用到的话,感觉这样会多写好几行。
一开始都这么写的,后来跟着以前代码直接_tableview=xxxx ,有点停不下来了都…… 我有时候还把约束也写进去,还得先 addsubview ,那个是真有些别扭…… |
10
hyyy OP @kidneyband
嗯嗯,说的对,我是对这个 delegate=self 真的不能忍,我总觉的这样写有问题,难道真的有强迫症了。。。 |
13
loveuqian 2016-06-21 17:22:45 +08:00
我行首党都没说看到这代码有强迫症呢
|
14
kidneyband 2016-06-21 17:23:43 +08:00
@ma125125t 不会出问题,你怎么会认为会出问题呢,说有把握的话。
|
15
zylll520 2016-06-21 17:26:07 +08:00
@ma125125t 你确定吗 在 getter 方法中只有在还没赋值前调用其 getter 方法才会出问题 其他没有任何问题
|
16
ma125125t 2016-06-21 17:30:18 +08:00
|
17
kidneyband 2016-06-21 17:31:33 +08:00
@ma125125t 还是不对
|
18
hyyy OP @kidneyband
哪里不对 |
19
ma125125t 2016-06-21 17:42:09 +08:00
|
20
finab 2016-06-21 17:54:20 +08:00 via iPhone
@ma125125t 有啥问题?只有在 set 或者 get 方法里调用自身才会有问题,例如这里的 getter 使用 self.tableView 才会出现问题。不明白你说的问题是什么问题
|
21
KgM4gLtF0shViDH3 2016-06-21 18:00:22 +08:00 via iPhone
滥用懒加载啊。
|
22
zylll520 2016-06-21 18:02:11 +08:00
发现一个奇怪的点 你这个不属于严格意义上的懒加载 而且你这个 tableview 估计是用 strong 来修饰的吧
|
23
ostholz 2016-06-21 18:33:39 +08:00
tableView 的 delegate 不会 retain 的. 所以这里是安全的.
|
24
zhangchioulin 2016-06-21 19:24:43 +08:00
@ma125125t 对于一开始不显示的控件,使用懒加载降低 cpu 占用
|
25
zhangchioulin 2016-06-21 19:25:43 +08:00
@hyyy 使用 _xxxx 并不等于 self.xxxx
|
26
zhangchioulin 2016-06-21 19:26:32 +08:00
@hyyy 看错啦 抱歉
|
27
qdvictory 2016-06-21 20:12:26 +08:00
不是很建议这样写。在程序上这样写是没有错的,但是使用场景上有可能会出现坑。
getter 方法会被多次调用,如果在方法外设定 self.tableView=nil;那么会造成当前页面存在多个 tableview 。 所以还是比较推荐生成和销毁的执行比为 1:1 来处理。 |
28
kera0a 2016-06-21 20:35:57 +08:00
@qdvictory 经典懒加载写法,怎么会有问题。
当你会重新赋值时,那你肯定会在 set 方法里妥善处理旧 tableView 。 另外这种写法,就没打算重新赋值,只是在用的地方(不知道在哪里会先用)直接 self.tableView 就能得到一个对象 |
29
Pandara 2016-06-21 20:41:12 +08:00
建议看看 sunnyXX 的 《招聘一个靠谱的 iOS 》跟 chenyilong 的相关解答,里面对这些基础的问题都有很详细的解答
|
30
rannie 2016-06-21 21:58:42 +08:00
有很多工程师还推荐这么写的 因为 Xcode 会方便跳到代码块,可以懒加载,而且不用把所有视图都写在一起分别标注, setupUI 的时候 直接 addSubview : self.xxx 就可以,里面都是布局代码而不用关心属性。
|
32
zsading 2016-06-24 09:29:45 +08:00
挺好的, casa 大神也推荐这么写
|