• 请不要在回答技术问题时复制粘贴 AI 生成的内容
hyyy
V2EX  ›  程序员

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

  •  
  •   hyyy · Jun 21, 2016 · 5296 views
    This topic created in 3797 days ago, the information mentioned may be changed or developed.

    经常重写 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 方法中是一种错误,但找不出理由来,各位大哥能不能告诉我到底对不对,证据在哪,不然我睡不着觉了。。。

    32 replies  •  2016-06-24 09:29:46 +08:00
    ma125125t
    ma125125t
    Jun 21, 2016
    1
    程序上来说,没什么问题。只不过为什么要把初始化写在 getter 里?统一写在一个 setupUI 里不是更清晰吗?
    lion9527
    lion9527
    Jun 21, 2016
    2
    没什么不对啊。 delegate 跟初始化放一起很正常啊。
    kidneyband
    kidneyband
    Jun 21, 2016
    3
    这样写显然对的,一方面一个控件的初始属性写在一起,分块看起来清晰,另一方面, lazyload, self.tableView 点出来的时候必定是有的,不必关系什么时候实例化的问题,再者你发现没有,你可以方便的跳到这个代码块。

    至于缺点嘛,稍慢,但我觉得优点多。
    kidneyband
    kidneyband
    Jun 21, 2016
    4
    不必关心
    hyyy
    hyyy
    OP
    Jun 21, 2016
    5
    难道大家都不觉得在 getter 中调用 self 会出问题,难道我真的有强迫症,完啦
    hyyy
    hyyy
    OP
    Jun 21, 2016
    6
    @lion9527
    关键是这个 self 会不会出问题
    kidneyband
    kidneyband
    Jun 21, 2016
    7
    @hyyy 你怀疑会不会出问题是你水平的问题,和这个代码没有关系。
    finab
    finab
    Jun 21, 2016 via iPhone
    8
    self 出什么问题? objc 的 getter 就是个普通方法。
    a412739861
    a412739861
    Jun 21, 2016
    9
    没什么问题吧,就是一般如果这个 tableview 是肯定用到的话,感觉这样会多写好几行。
    一开始都这么写的,后来跟着以前代码直接_tableview=xxxx ,有点停不下来了都……

    我有时候还把约束也写进去,还得先 addsubview ,那个是真有些别扭……
    hyyy
    hyyy
    OP
    Jun 21, 2016
    10
    @kidneyband
    嗯嗯,说的对,我是对这个 delegate=self 真的不能忍,我总觉的这样写有问题,难道真的有强迫症了。。。
    ma125125t
    ma125125t
    Jun 21, 2016
    11
    @finab 在 getter 中写 self.delegate 是会出问题的,但 self 写在右边不会出问题
    hyyy
    hyyy
    OP
    Jun 21, 2016
    12
    @ma125125t
    说的靠谱,先👍个,为什么 self 放在左边会出问题呢?
    loveuqian
    loveuqian
    Jun 21, 2016
    13
    我行首党都没说看到这代码有强迫症呢
    kidneyband
    kidneyband
    Jun 21, 2016
    14
    @ma125125t 不会出问题,你怎么会认为会出问题呢,说有把握的话。
    zylll520
    zylll520
    Jun 21, 2016
    15
    @ma125125t 你确定吗 在 getter 方法中只有在还没赋值前调用其 getter 方法才会出问题 其他没有任何问题
    ma125125t
    ma125125t
    Jun 21, 2016
    16
    @zylll520
    @kidneyband 这里确实没问题,是我疏忽了。

    @hyyy 我遗漏了上面那个判断,抱歉。如果没有那个判断,在 getter 里写 self.相当于递归了。
    kidneyband
    kidneyband
    Jun 21, 2016
    17
    @ma125125t 还是不对
    hyyy
    hyyy
    OP
    Jun 21, 2016
    18
    @kidneyband
    哪里不对
    ma125125t
    ma125125t
    Jun 21, 2016
    19
    @kidneyband
    @hyyy 确实不对,是 setter 才会有此问题。
    finab
    finab
    Jun 21, 2016 via iPhone
    20
    @ma125125t 有啥问题?只有在 set 或者 get 方法里调用自身才会有问题,例如这里的 getter 使用 self.tableView 才会出现问题。不明白你说的问题是什么问题
    KgM4gLtF0shViDH3
    KgM4gLtF0shViDH3
    Jun 21, 2016 via iPhone
    21
    滥用懒加载啊。
    zylll520
    zylll520
    Jun 21, 2016
    22
    发现一个奇怪的点 你这个不属于严格意义上的懒加载 而且你这个 tableview 估计是用 strong 来修饰的吧
    ostholz
    ostholz
    Jun 21, 2016
    23
    tableView 的 delegate 不会 retain 的. 所以这里是安全的.
    zhangchioulin
    zhangchioulin
    Jun 21, 2016
    24
    @ma125125t 对于一开始不显示的控件,使用懒加载降低 cpu 占用
    zhangchioulin
    zhangchioulin
    Jun 21, 2016
    25
    @hyyy 使用 _xxxx 并不等于 self.xxxx
    zhangchioulin
    zhangchioulin
    Jun 21, 2016
    26
    @hyyy 看错啦 抱歉
    qdvictory
    qdvictory
    Jun 21, 2016
    27
    不是很建议这样写。在程序上这样写是没有错的,但是使用场景上有可能会出现坑。
    getter 方法会被多次调用,如果在方法外设定 self.tableView=nil;那么会造成当前页面存在多个 tableview 。
    所以还是比较推荐生成和销毁的执行比为 1:1 来处理。
    kera0a
    kera0a
    Jun 21, 2016
    28
    @qdvictory 经典懒加载写法,怎么会有问题。
    当你会重新赋值时,那你肯定会在 set 方法里妥善处理旧 tableView 。
    另外这种写法,就没打算重新赋值,只是在用的地方(不知道在哪里会先用)直接 self.tableView 就能得到一个对象
    Pandara
    Pandara
    Jun 21, 2016
    29
    建议看看 sunnyXX 的 《招聘一个靠谱的 iOS 》跟 chenyilong 的相关解答,里面对这些基础的问题都有很详细的解答
    rannie
    rannie
    Jun 21, 2016
    30
    有很多工程师还推荐这么写的 因为 Xcode 会方便跳到代码块,可以懒加载,而且不用把所有视图都写在一起分别标注, setupUI 的时候 直接 addSubview : self.xxx 就可以,里面都是布局代码而不用关心属性。
    564425833
    564425833
    Jun 22, 2016
    31
    @qdvictory 不是都 if(不存在)才会创建吗,为什么会出现多个呢?
    zsading
    zsading
    Jun 24, 2016
    32
    挺好的, casa 大神也推荐这么写
    About   ·   Help   ·   Advertise   ·   Blog   ·   API   ·   FAQ   ·   Privacy   ·   Solana   ·   2144 Online   Highest 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 75ms · UTC 12:32 · PVG 20:32 · LAX 04:32 · JFK 07:32
    ♥ Do have faith in what you're doing.