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

不开启ARC的几个理由

  •  
  •   surf · 2012-01-17 12:08:16 +08:00 · 7777 次点击
    这是一个创建于 4485 天前的主题,其中的信息可能已经有所发展或是发生改变。
    1.原生基于引用计数的内存管理方法已经很高效和简洁了,ARC认为一个程序员连着都搞不定,这不是BS我的智商么 (当然ARC只是为了让程序员能够考虑得更上层一些)
    2.大部分第三方库不支持
    3.ARC本身并不完善 ------这个不完善是我自己猜的,很难想象有这么一种机制能够完全替代掉GC又有接近手动管理内存的效率,ARC是否好用还需要时间考验

    大家认为呢?
    27 条回复    1970-01-01 08:00:00 +08:00
    AntiGameZ
        1
    AntiGameZ  
       2012-01-17 12:10:51 +08:00
    这么说,应该是“目前不开启ARC的几个理由吧”
    surf
        2
    surf  
    OP
       2012-01-17 12:12:54 +08:00
    @AntiGameZ 要标题党一下 娃哈哈
    Echoldman
        3
    Echoldman  
       2012-01-17 12:28:48 +08:00
    确实,我也觉得ARC是给多年经验的人用的,新手肯定是驾驭不了
    ultragtx
        4
    ultragtx  
       2012-01-17 12:29:08 +08:00
    貌似是无论从效率还是各种方面考虑都没有什么理由不用ARC,虽然我至今没在项目中用过
    对于第一条,ARC要想用好肯定还是要先搞明白引用计数机制,所以不是鄙视你的智商
    第二条,有参数可以对单个文件禁用arc
    第三条,ARC应该已经彻底取代了GC,至少官方是这么认为的
    surf
        5
    surf  
    OP
       2012-01-17 12:44:37 +08:00
    @ultragtx 第一条纯属调侃 =。=
    第二条操作起来并不是这么简单
    第三条的话还是要看未来表现了
    wtl
        6
    wtl  
       2012-01-17 13:36:24 +08:00
    编译期自动加入release没那么复杂

    目前所有项目均已开启arc
    第三方library反正可以直接用
    如果蛋疼也可以帮它开启
    levey
        7
    levey  
       2012-01-17 13:59:51 +08:00
    我还是自己release比较有谱。。。
    lldong
        8
    lldong  
       2012-01-17 14:11:57 +08:00
    话说ARC在效率上也会有提升,一些原来通过发送消息做的事情会直接通过运行时API的函数去做(比如-release对应的objc_release()函数),按官方的说法效率会提升不少。

    针对第三方的代码可以设置为编译时不使用ARC,所以应该也没多大问题。
    fly2never
        9
    fly2never  
       2012-01-17 14:34:20 +08:00
    现在的项目手动管理内存运行的还不错,不太想换...
    linlinqi
        10
    linlinqi  
       2012-01-17 14:41:42 +08:00
    1. 我觉得ARC对新人来说反而简单了,你看他都不用手动release, retain
    2. 第三方代码加上不使用ARC的标记很简单
    acwind
        11
    acwind  
       2012-01-17 16:32:49 +08:00
    最近的一个项目心血来潮使用了 ARC,然后发现第三方的库报错,还要一个一个对那些不支持的库文件手动关掉 ARC 的支持。
    不过用下来还是很省心,代码呼哧呼哧一口写下来不用操心太多。不像以前总是要算算计一下什么时候该 release,是否要弄个 auteorelease,现在都不用关心了,哈哈……
    感觉还不错,觉得以后越来越多的项目都会逐渐开始使用 ARC 了吧……
    ohsc
        12
    ohsc  
       2012-01-17 21:54:42 +08:00
    公司产品还需要支持iOS4,目前还是手动release吧。
    wtl
        13
    wtl  
       2012-01-17 22:12:32 +08:00
    @ohsc arc不是gc,只是在编译期帮你添加release,iOS4一样可以跑
    hiessu
        14
    hiessu  
       2012-01-17 22:52:04 +08:00
    应该尽可能多的使用ARC,第三方的库加参数不用ARC编译就好了。少写代码的感觉就是舒心,而且论效率绝对不输手动管理。
    hiessu
        15
    hiessu  
       2012-01-17 22:55:17 +08:00
    @Echoldman 你根本不需要学ARC的机制,直接用就好了,就这么简单。
    @ohsc 用ARC,iOS4一样跑~
    hiessu
        16
    hiessu  
       2012-01-17 23:04:01 +08:00
    @hiessu 再补充一下吧,ARC方式下的iOS4、iOS5还是有差别的。ARC的机制看一下这两篇~ http://www.raywenderlich.com/5677/beginning-arc-in-ios-5-part-1 和 2
    changx
        17
    changx  
       2012-01-18 01:51:08 +08:00
    手动 retain/release 的时候已经有一种快感了,囧
    blogcool
        18
    blogcool  
       2012-01-18 08:58:19 +08:00
    对于第三方代码或库 xcode可以转成支持arc,或手动添加禁用标记
    ohsc
        19
    ohsc  
       2012-01-18 09:13:04 +08:00
    @hiessu @wtl 原来如此,我以为要ios5,回头尝试一下。
    stcui
        20
    stcui  
       2012-01-18 09:22:31 +08:00
    第三方代码可以先打成静态库再链接到程序里
    soulhacker
        21
    soulhacker  
       2012-01-18 10:08:13 +08:00
    1. 我会建议新手先学习正常的内存管理达到比较熟练,然后可以开始使用ARC;
    2. 第三方库可以隔离,而且慢慢也越来越多支持了;
    3. 这个太莫须有了吧…
    feilaoda
        22
    feilaoda  
       2012-01-18 18:45:08 +08:00
    @soulhacker 这个不一定哦,学java一般情况都不太需要考虑内存管理
    ARC是趋势,而且比GC好
    soulhacker
        23
    soulhacker  
       2012-01-18 19:01:15 +08:00 via iPhone
    @feilaoda 你说的原理上都对,但实际上有很多麻烦是没法现在就完全依赖于 ARC 的,所以…
    feilaoda
        24
    feilaoda  
       2012-01-18 20:10:04 +08:00
    @soulhacker 愿闻其详
    elden
        25
    elden  
       2012-01-18 20:21:23 +08:00
    ARC还不能完全取代GC,比如还存在可能造成循环引用,导致泄漏的情况。
    wtl
        26
    wtl  
       2012-01-18 20:35:43 +08:00
    @elden GC从来没有被苹果当回事......
    soulhacker
        27
    soulhacker  
       2012-01-19 10:39:31 +08:00
    @feilaoda 简单说说:

    1. GC 和 ARC 原理差别很大,ARC 类似于自动代码生成,对于几乎所有自动代码生成机制,程序员最好能了解其生成的原理,这样应对一些奇怪问题时会有帮助;GC 则是 VM 的工作,一般的程序员(除非你做 VM 的)确实不需要了解。
    2. 如果使用 Core Foundation 里的库,开启 ARC 需要大量的手工代码检查和确认工作,所以很多用了 CFNetwork、CoreText 等框架的程序员暂时会选择保留遗留代码,不用 ARC(当然也可以 per-file 设置,但管理起来还是有点麻烦)。
    3. 相当数量的 app 还要支持 iOS 4 以下的版本,目前 Apple 不支持在这些版本上开启 ARC。

    最后,我并不是说一定要熟悉内存管理原理之后才能用 ARC,我只是说目前阶段,如果可能的话先熟悉再用会更好些。
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   我们的愿景   ·   实用小工具   ·   983 人在线   最高记录 6543   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 26ms · UTC 21:35 · PVG 05:35 · LAX 14:35 · JFK 17:35
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.