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
lynulzy
V2EX  ›  iDev

关于 Runtime 的使用,各位大神进来说说

  •  
  •   lynulzy · 2015-08-14 11:14:55 +08:00 · 4310 次点击
    这是一个创建于 3387 天前的主题,其中的信息可能已经有所发展或是发生改变。

    Runtime 这个话题从来都是中高级iOS开发者面试的必问题目,有互联网基因的公司都会比较重视面试者相关知识的掌握程度,这也是本猿面试多家互联网公司得到的经验(准确的说是教训),然而事实是在日常开发工作中并没有用到太多,在了解到一些Runtime的牛逼之处之后,觉得应该有很广的应用。

    从这篇文章开始说起

    介绍了Runtime的一些基础知识,基本概念。

    • Objective-C对象在Runtime下转换成C的形式
    • 集成自NSObject类能在Runtime角度带来什么样的好处
    • objc_msgSend方法执行过程
    • 消息转发(这个有使用场景)

    其中提到的一个场景
    消息转发,在另一篇文章中也有详细的阐述,当obj_msgSend找不到类中对方法的实现的时候有三个入口可以手动的提供相应的实现方法,在这里有详细阐述。

    针对Runtime的实际使用场景,我也找到另外一篇使用Runtime给Model类赋值

    So 问题来了

    在网上也找了一些资料,然而指明某种应用场景的很少,而自己对这方面的理解也并不深刻,希望有过使用经验的朋友能够分享一些使用Runtime的场景,或者某些关于Runtime的(黑魔法)。

    13 条回复    2015-08-17 19:49:36 +08:00
    kepenj
        1
    kepenj  
       2015-08-14 11:32:59 +08:00   ❤️ 1
    方法调配、关联对象、多继承、私有方法或参数的获取和调用,等等。 OC设计的核心是运行时,同时runtime是开源的,相关函数的介绍和函数的实现苹果已经提供给你了,玩法都是人造出来的。
    lynulzy
        2
    lynulzy  
    OP
       2015-08-14 11:58:28 +08:00
    @kepenj 对的,问题的关键在于没玩过...您说的这几个倒是好理解
    doluvor
        3
    doluvor  
       2015-08-14 12:11:00 +08:00 via Android
    用method swizzle扩展一些SDK和获取SDK内部参数
    nathanw
        4
    nathanw  
       2015-08-14 12:49:48 +08:00
    我觉得 runtime 是为了考察你对 oc 的理解,重点不在玩法。想要知道更多广泛的应用,就多看看别人的开源库,博客,还有增加自己的实际开发经验。因为有些用法是为了解决某些特定需求,并不是一句两句可以说得清的。在这里先给你推荐一个大神的库 https://github.com/bang590/JSPatch
    cxq
        5
    cxq  
       2015-08-14 16:08:14 +08:00
    之前维护旧项目有用到,而且很好用。前一段时间 客户有个要求,要让一个已经上线的项目下个版本,所有按钮支持主题切换,也就是说每个按钮要支持多一张图。
    每个按钮要知道当前显示的图片的名字,切换主题时按钮要根据当前图片切换到另一张图。

    要做到这个要为UIButton增加一个imageName的属性,并且重写写setBackgroundImage forState记得当前是什么图片。 用继承一个一个替Button换类太花时间,客户等不了。

    后来用associated object 给UIButton增加了imageName属性,method swizzle 给setBackgroundImage forState对imageName的赋值, 本地加了个json文件记录图片的配对。最后省了好多时间。

    不过现在也不知道这么做有负面影响?求大神指点。
    Cee
        6
    Cee  
       2015-08-14 16:20:51 +08:00
    CFHipsterRef
    jesse_luo
        7
    jesse_luo  
       2015-08-14 18:19:52 +08:00
    实现 AOP 算一个么……
    pengjay
        8
    pengjay  
       2015-08-14 20:51:11 +08:00
    关联对象用的比较多
    wezzard
        9
    wezzard  
       2015-08-14 21:03:10 +08:00
    其实这些都是初级技巧,考验你对 C 语言和计算机工作原理的认知,你这两个认知到位了,runtime 很容易。其实对于很多设计、很多奇技淫巧,你站在它们的出发点去检视它们被创造出来之前开发人员所面对的困境,就可以很容易推导出它们为何如此的原因。切忌因为要学习奇技淫巧而去学习奇技淫巧。
    j16ZgMV9cs6ZB23n
        10
    j16ZgMV9cs6ZB23n  
       2015-08-14 23:03:22 +08:00
    @Cee +1
    lynulzy
        11
    lynulzy  
    OP
       2015-08-14 23:06:36 +08:00
    @nathanw 大致看了下,大量使用消息转发,值得学习!

    @cxq 关联对象的使用、method swizzle,感谢!
    @Cee 这本书怎么样?
    @jesse_luo 666当然算
    lynulzy
        12
    lynulzy  
    OP
       2015-08-14 23:09:27 +08:00
    @wezzard 嗯,感谢,没有要去为了...学习... 准确的说不是为了什么,至少觉得这么牛逼的东西之前一直没用过,觉得挺low,了解一下如果对以后的工作有裨益,用一用,何乐而不为呢?
    hohoho
        13
    hohoho  
       2015-08-17 19:49:36 +08:00 via iPhone
    effective objective-c 不错,个人感觉对了解 runtime 挺有帮助,楼主可以参考下
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   5300 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 25ms · UTC 01:26 · PVG 09:26 · LAX 17:26 · JFK 20:26
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.