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

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

  •  
  •   hyyy · Jun 21, 2016 · 4855 views
    This topic created in 3622 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
        1
    ma125125t  
       Jun 21, 2016
    程序上来说,没什么问题。只不过为什么要把初始化写在 getter 里?统一写在一个 setupUI 里不是更清晰吗?
    lion9527
        2
    lion9527  
       Jun 21, 2016
    没什么不对啊。 delegate 跟初始化放一起很正常啊。
    kidneyband
        3
    kidneyband  
       Jun 21, 2016
    这样写显然对的,一方面一个控件的初始属性写在一起,分块看起来清晰,另一方面, lazyload, self.tableView 点出来的时候必定是有的,不必关系什么时候实例化的问题,再者你发现没有,你可以方便的跳到这个代码块。

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

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

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