V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
iOS 开发实用技术导航
NSHipster 中文版
http://nshipster.cn/
cocos2d 开源 2D 游戏引擎
http://www.cocos2d-iphone.org/
CocoaPods
http://cocoapods.org/
Google Analytics for Mobile 统计解决方案
http://code.google.com/mobile/analytics/
WWDC
https://developer.apple.com/wwdc/
Design Guides and Resources
https://developer.apple.com/design/
Transcripts of WWDC sessions
http://asciiwwdc.com
Cocoa with Love
http://cocoawithlove.com/
Cocoa Dev Central
http://cocoadevcentral.com/
NSHipster
http://nshipster.com/
Style Guides
Google Objective-C Style Guide
NYTimes Objective-C Style Guide
Useful Tools and Services
Charles Web Debugging Proxy
Smore
LMkillme
V2EX  ›  iDev

解释下这行代码的作用或者含义?

  •  
  •   LMkillme · 2016-01-06 19:25:20 +08:00 · 3821 次点击
    这是一个创建于 3004 天前的主题,其中的信息可能已经有所发展或是发生改变。


    图中划红线的那一行,对我来说类似「 我家门前有两棵树,一棵是枣树,另一棵也是枣树。」,完整代码 https://github.com/zwaldowski/AdvancedCollectionView
    第 1 条附言  ·  2016-01-07 09:54:20 +08:00
    原因是线程安全,详见文章 http://objccn.io/issue-2-4/
    17 条回复    2016-04-01 09:16:30 +08:00
    morefreeze
        1
    morefreeze  
       2016-01-06 19:57:05 +08:00   ❤️ 1
    似乎以后都可以少打 4 个字符?
    LMkillme
        2
    LMkillme  
    OP
       2016-01-06 20:02:25 +08:00
    @morefreeze 实际上是多打了几十个字符……
    kevinzhwl
        3
    kevinzhwl  
       2016-01-06 20:04:50 +08:00 via Android   ❤️ 1
    不熟 oc ,是不是前面是局部变量,后面是成员变量?
    这样还是有点现实意义的,方便。
    效率上编译器应该会优化的
    noli
        4
    noli  
       2016-01-06 20:07:05 +08:00   ❤️ 1
    非要细究的话,可能的考虑就是 在
    dataSource registerReusableViewsWithCollectionView: 之前可能会被另外一个线程改变 self.collectionView
    LMkillme
        5
    LMkillme  
    OP
       2016-01-06 20:27:26 +08:00
    @kevinzhwl 前面是局部变量,后面是成员变量。
    「方便」体现在哪里呢?编译器优化又是?
    LMkillme
        6
    LMkillme  
    OP
       2016-01-06 20:29:14 +08:00
    @noli 另一个线程改变了 self.collectionView ,那此处的 collectionView 所指向的 collectionView 也是变了呀。
    LMkillme
        7
    LMkillme  
    OP
       2016-01-06 20:33:32 +08:00
    @noli 哦,我大概明白你的意思了,是指 self.collectionView 改变了指向?
    fly2never
        8
    fly2never  
       2016-01-06 21:56:12 +08:00   ❤️ 1
    如果方法内用到了几十次 self.collectionView, 那么这么节省一下字符是有意义的
    LMkillme
        9
    LMkillme  
    OP
       2016-01-06 22:45:36 +08:00
    @fly2never 然而并没有
    josephshen
        10
    josephshen  
       2016-01-06 23:09:41 +08:00 via iPhone   ❤️ 1
    经常这样写,一是如果函数长可以少打点字,二是这样去掉 self 后肉眼 parser 更连贯,三是如果这样写能让右边段落对齐或者长短有秩的话、看上去更美就这样写
    iyeatse
        11
    iyeatse  
       2016-01-07 01:11:38 +08:00   ❤️ 1
    苹果官方的例子有很多地方这么写,我就学着这么写了。
    脑洞一下,除了看起来整齐以外,每次调用 self.collectionView 实际上都是调用了一次 selector ,执行效率上可能会有问题。。?
    canautumn
        12
    canautumn  
       2016-01-07 01:49:30 +08:00   ❤️ 1
    每次调用 property getter 会有额外开销,有人实际对比测试过,但其实因为额外开销只有你重复调用成千上万次才比较显著。即使想避免额外开销,也可以直接调用 Instance Variable (下划线开头的)而不用再赋值一次指针。根据 Effective Objective-C 2.0 ,内部访问成员变量时推荐在读取时直接访问 Instance Variable ,而写入时访问 property ,以获取性能和封装性的最佳平衡。

    当然了,写成这样也不错,肯定也有他的理由,但我觉得只是风格不同罢了。
    canautumn
        13
    canautumn  
       2016-01-07 02:03:40 +08:00   ❤️ 1
    刚才只看了楼上讨论没仔细看代码,我之前说错了,这个地方应该不是风格考虑而是线程安全的考虑。 4 楼才是正解。
    有一个几乎一模一样的例子,在某期 objc.io 讲 thread safe 的时候应该有提到。
    LMkillme
        14
    LMkillme  
    OP
       2016-01-07 09:53:44 +08:00
    @canautumn 正解,感谢。文章地址 http://objccn.io/issue-2-4/
    Alchemistxxd
        15
    Alchemistxxd  
       2016-01-15 12:29:28 +08:00
    其实就是保存了一个指针,用于指向这个实例,确保在 self.property 指针被修改后也能访问到他,我以前在用 DisplayLink 的时候就踩过这种坑。
    josephshen
        16
    josephshen  
       2016-04-01 01:01:42 +08:00 via iPhone
    我虽然不怎么写 iOS ,但是这个似乎是一个 UI 操作,无论如何 UI 操作不都是应该避免多线程的么?所以你们不觉得上面的说法是不妥的嘛?
    LMkillme
        17
    LMkillme  
    OP
       2016-04-01 09:16:30 +08:00
    @josephshen UIKit 本身并不是线程安全的。
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   我们的愿景   ·   实用小工具   ·   3104 人在线   最高记录 6543   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 26ms · UTC 12:58 · PVG 20:58 · LAX 05:58 · JFK 08:58
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.