Xcode ARC详解全攻略
ios5中,有个很吸引眼球的特性就是“Automatic Reference Counting”,简单来说就是内存自动回收,看起来似乎是平时开发中遇到的各种内存问题的福音,仔细了解了一下,似乎没有那么美好:1、需要iOS5才支持;2、很多引用的类库暂时还不支持.麻烦的是对大多数第三方库需要加禁用arc的编译flag,因为大多都因为兼容性还在使用手动内存管理。
手动管理内存经常忘掉release或autorelease,或者因为release多了、retain少了导致空指针引用程序崩溃,还要经常按COMMAND+SHIFT+B,岂止头疼,简直蛋疼有木有。
虽然objective-c 2.0支持垃圾收集器(Garbage Collection,简称GC),但是垃圾收集器只能在MAC程序上开启,ios上没办法用。就算在MAC应用程序上可以用,GC也会有性能上的损耗。
现在LLVM3.0多了一个给力的新东西,叫Automatic Reference Counting。开启这个选项之后,LLVM会在编译阶段自动帮开发者完成“手动”的内存管理。同时,所有代码中的retain,release和 autorelease会被标记成错误,也就是说,我们完全不需要用以前头蛋俱疼的方式管理内存了。
ARC不仅可以修复错误,还能增强性能。根据WWDC 2011大会的介绍,retain/release快了2.5倍,@autoreleasepool快了6倍,objc_msgSend快了33%。
一、旧工程开启ARC的方法
xCode4.2中已经自带了LLVM3.0,在用新的模板建立工程时,编译器默认选择LLVM3.0,并且开启ARC。如图。
xCode4.2 也为ARC提供了自动转换工具。首先将工程的编译器切换为LLVM3.0,然后在菜单里选择Edit—-Refactor—-Convert to Objective-C ARC…。LLVM会将不能转换的部分标记为错误,要求我们手动修改。一般NSAutoReleasePool不能自动转换,要手动转为 @autoreleasepool。CF框架的方法也不能自动转换,而release、retain和autorelease是可以自动转换的。我们将不 能自动转换的错误手动修改好后,编辑器将完成自动转换。
对 于可能出现的错误,WWDC 2011的视频中给出了一些例子。比如用static count来处理singletons pattern;用weak来申明delegate pattern;用dispatch_once来保证多线程的安全;在case关键字后面加上大括号{..}来限制case里面申明变量的作用范围等等。
二、开启ARC后需要遵循的原则
1、不能调用retain/release/autorelease,这些由编译器来完成。
2、结构内不能有对象指针,如果结构中包含,则需要以类代替结构。
3、不能使用id<–>void *的类型转换,因为编译器不知道这个void *是否需要retained。
4、不能使用NSAutoreleasedPool,要用@autoreleasepool {……}来代替。
三、ARC中引入的四个新的关键字
1、Strong Reference,强引用。默认类型,不加任何关键字(也可以写成__strong)。相当于之前代码中的retain属性。
2、Autoreleasing Reference,自动释放引用。通常出现在例如系统error处理函数中(关键字__autoreleasing),描述out-parameters用,只保存在栈中,不太常用。
3、Unsafe Reference,不安全引用。类似于之前代码中的assign属性,不分配内存(关键字__unsafe_unretained),相当于起了个别名。
4、Weak Reference,弱引用。前面提到过,不增加计数,当对象开始释放时,立刻设置成nil。
四、ARC中循环引用造成内存泄露的原因与解决办法
ARC通过记录指向某对象的指针数量来判断该对象是否应该被释放(0代表可以释放)。因而如果出现循环引用,就会出现内存泄露。如下图所示。
五、Instruments的Leaks的新功能
相关推荐
Xcode 4.1/4.2/4.3/4.4/4.5 + iOS 5.1.1免证书(iDP)开发+真机调试+生成IPA全攻略
### VMware虚拟机安装macOS及配置Xcode环境详解 #### 一、前言 随着iOS应用的日益流行,越来越多的开发者需要在Mac操作系统上进行开发。然而,并非所有人都能拥有真实的Mac硬件,这时候通过虚拟机来模拟Mac环境就...
Xcode14.3 File not found libarclite_iphonesimulator.a and libarclite_iphoneos.a,xocde14.3会删除xocde的arc文件夹,致使项目报错,解决办法,把旧版arc包拖入xocde即可
ARC是Xcode 4.2引入的一个特性,它自动跟踪对象的生命周期并负责在适当的时候释放内存。在ARC模式下,编译器会自动添加retain、release和autorelease等内存管理调用,开发者不再需要手动管理这些操作。这降低了内存...
这个是之前那个的第三段压缩包,不要分。这个是之前那个的第三段压缩包,不要分。这个是之前那个的第三段压缩包,不要分。
前往文件夹 /Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/lib/ 将下载的arc 文件夹复制到lib文件夹下
解决 Xcode 14.3,Xcode 15 旧项目可能报错 SDK does not contain 'libarclite' at the path '/Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/lib/arc/libarclite_iphone...
Xcode3的开发详解,尽管Xcode4要比Xcode3好用的多,但是找不到4的教程所以就只能看3的了,很详细。不让上传60m以上的所以就分段压缩了,后面的段不要分!
目录解压后复制到指定目录路径: /Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/lib
### XCode 4.2(4.1)真机调试及生成IPA全攻略 #### 一、背景介绍 Xcode是苹果公司提供的官方集成开发环境(IDE),主要用于iOS、macOS、watchOS 和 tvOS应用的开发。Xcode 4.2 (包括4.1) 是苹果在2011年左右发布的...
这个是之前那个的第二段压缩包。这个是之前那个的第二段压缩包。这个是之前那个的第二段压缩包。不要分
在软件开发中,特别是在iOS应用开发中,使用Xcode作为主要的开发环境,开发者需要管理不同版本的构建(Build)。通常情况下,每次编译应用时,开发者会手动增加Build版本号来区分不同版本的构建,以便于内部测试和...
#### 二、卸载Xcode的命令详解 卸载Xcode主要依赖于两个命令:`uninstall-devtools`和`uninstall-developer-folders`。这两个命令分别位于不同的路径下,但都需要通过`sudo`命令以管理员权限执行。 1. **卸载开发...
**iOS 15.1 Xcode包详解** iOS 15.1是Apple在其iOS操作系统中的一个重要更新,它带来了多项新特性和改进,为开发者和用户提供了更好的体验。Xcode作为Apple官方的集成开发环境(IDE),是开发iOS、macOS、watchOS...
### Xcode 版本概述与比较 Xcode 是苹果公司为开发者提供的官方集成开发环境(IDE),主要用于开发 iOS、macOS、watchOS 和 tvOS 的应用程序。随着时间的推移,Xcode 经历了多个版本的迭代和发展。本文将重点介绍 ...
**Xcode iOS11.0配置包详解** Xcode是Apple官方推出的开发工具,用于构建、测试和发布iOS、iPadOS、macOS、watchOS以及tvOS的应用程序。在这个特定的场景中,我们讨论的是针对iOS 11.0版本的Xcode配置包。这个配置...
这是Xcode旧版本的arc文件,用于解决跟新后找不到库的错误
《Xcode 12.1镜像文件:保持对iOS 12.1真机支持的详尽指南》 在iOS应用开发过程中,Xcode作为官方的集成开发环境(IDE),扮演着至关重要的角色。然而,随着新版本的发布,开发者们可能会面临一个问题:如何在不...