V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
hyyy
V2EX  ›  程序员

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

  •  
  •   hyyy · 2016-06-21 16:49:55 +08:00 · 4177 次点击
    这是一个创建于 2868 天前的主题,其中的信息可能已经有所发展或是发生改变。

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

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

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

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