V2EX = way to explore
V2EX 是一个关于分享和探索的地方
Sign Up Now
For Existing Member  Sign In
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 · Jan 6, 2016 · 4690 views
    This topic created in 3764 days ago, the information mentioned may be changed or developed.


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

    当然了,写成这样也不错,肯定也有他的理由,但我觉得只是风格不同罢了。
    canautumn
        13
    canautumn  
       Jan 7, 2016   ❤️ 1
    刚才只看了楼上讨论没仔细看代码,我之前说错了,这个地方应该不是风格考虑而是线程安全的考虑。 4 楼才是正解。
    有一个几乎一模一样的例子,在某期 objc.io 讲 thread safe 的时候应该有提到。
    LMkillme
        14
    LMkillme  
    OP
       Jan 7, 2016
    @canautumn 正解,感谢。文章地址 http://objccn.io/issue-2-4/
    Alchemistxxd
        15
    Alchemistxxd  
       Jan 15, 2016
    其实就是保存了一个指针,用于指向这个实例,确保在 self.property 指针被修改后也能访问到他,我以前在用 DisplayLink 的时候就踩过这种坑。
    josephshen
        16
    josephshen  
       Apr 1, 2016 via iPhone
    我虽然不怎么写 iOS ,但是这个似乎是一个 UI 操作,无论如何 UI 操作不都是应该避免多线程的么?所以你们不觉得上面的说法是不妥的嘛?
    LMkillme
        17
    LMkillme  
    OP
       Apr 1, 2016
    @josephshen UIKit 本身并不是线程安全的。
    About   ·   Help   ·   Advertise   ·   Blog   ·   API   ·   FAQ   ·   Solana   ·   5658 Online   Highest 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 46ms · UTC 06:50 · PVG 14:50 · LAX 23:50 · JFK 02:50
    ♥ Do have faith in what you're doing.