zoukankan      html  css  js  c++  java
  • 升级到ios5之后 引入ARC的学习

    iOS引入了Automatic Reference Count(ARC),编译器可以在编译时对obj-c对象进行内存管理。

    之前,obj-c的内存管理方式称作引用计数,就是obj-c对象每被”使用”一次,引用计数+1,当引用计数为0时,系统会回收内存.用程序语言 表达,就是allco的要release,retain/copy的要release.还有某些容器add的,也要release等等.

    现如今,ARC使你勿需理会这些内存管理规则,但同时一些语法也相应的作了改变,具体有哪些变化我们一一解析.

    首先新建一个工程(注意Xcode得是4.2),选择使用ARC(如果在新建工程的时候没有选择ARC,随后在些代码的时候又想使用ARC,只需在Build Setting中更改),

    然后直奔main函数,

    复制代码
    int main(int argc, char *argv[])

    {

    @autoreleasepool {

    return UIApplicationMain(argc, argv, nil, NSStringFromClass([ZJAppDelegate class]));

    }

    复制代码

    对比未使用ARC的main函数:

    复制代码
    NSAutoreleasePool * pool = [[NSAutoreleasePool alloc] init];

    int retVal = UIApplicationMain(argc, argv, nil, nil);

    [pool release];

    return retVal;
    复制代码

    NSAutoreleasePool在ARC中被禁止使用,替换成@autoreleasepool 函数体.使用@ autoreleasepool,在函数入口的时候,autorelease pool入栈,正常退出时,autorelease pool出栈,从而释放变量. 注意@ autoreleasepool在非ARC模式下,也能使用,并据称使用@autoreleasepool比使用NSAutoreleasePool速度 能快6倍, 明显提升程序性能.

     

    然后打开delegate函数,会发现声明的property有个新的关键字:

    @property (strong, nonatomic) UIWindow *window;

    strong是新的property限定词,相当于之前的retain,还有一个新的限定词是weak相当于assign. 要注意使用weak reference的时候,当你需要使用对象的时候,可能对象已经不存在了.weak的作用通常只在于避免循环引用.

    再查看任一m文件,你会发现没有dealloc函数.ARC中dealloc不需要显示实现,编译器会自己实现.有时候你设计的类会有 delegate对象,这时你可以实现dealloc函数在其中将delegate置为nil,但是不要调用[super dealloc],编译器自己会调用.

     此外,ARC还有变量限定词:__strong,__weak,__unsafe_unretained和__autoreleasing

    __strong是默认的,__weak表明对象是zeroing weak reference,意思是当对象所指向的内存销毁了,zidong置为空nil. __unsafe_unretained是对对象的非zeroing的weak reference,意思是当对象所指向的内存被销毁了,对象还存在,成为”野指针”.__ autoreleasing用于对(id *)类型的参数传递.

     

    Apple举了个例子,

    NSString __weak *string = [[NSString alloc] initWithFormat:@"First Name: %@", [self firstName]];

    NSLog(@"string: %@", string);

    因为在初始化的时候声明了__weak,即zeroing weak reference,初始化完后立马会被销毁,所以NSLOg时显示NULL.

    因为ARC是编译时进行的,我们还可以选择哪些文件使用ARC编译,如图:

     

    对于要自己管理内存的文件,设置值为-fno-objc-arc即可。

     

    最后,简单的总结下ARC下新规则:

    • 不能使用retai,release,retainCount,autorelease,NSAutoreleasePool. 通常情况下dealloc函数不需要实现,除非你需要置delegate为nil.
    • Strong相当于retain,weak相当于assign.
    • 声明的property中,不能以new开头.

    有不正确的地方,欢迎大家批评指正。

    PS:关于mac os 以及ios上使用CF类时,ARC的管理待后续学习。

    来源:http://www.cnblogs.com/scorpiozj/archive/2011/10/24/2222609.html


    ARC的使用限制:

    ARC工作原理是在编译程序的时候由xCode将内存操作的代码(如:retain,release 和 autorelease)自动添加到需要的位置。

    ARC 只能在iOS4 和iOS5上使用,weak refrences 只能在iOS5上使用,并且只能是工程在ARC管理内存的时候才能用。

    老版本的工程是可以转换成使用ARC的工程,转换规则包括:

            1.去掉所有的retain,release,autorelease

            2.把NSAutoRelease替换成@autoreleasepool{}块

            3.把assign的属性变为weak

    使用ARC的一些强制规定

            1.不能直接调用dealloc方法,不能调用retain,release,autorelease,reraubCount方法,包括@selector(retain)的方式也不行

            2.截图租户事故宣布dealloc方法来管理一些资源,但不能用来释放实例变量,也不能在dealloc方法里面去掉[super dealloc]方法,在ARC下父类的dealloc同样由编译器来自动完成

            3.Core Foundation类型的对象任然可以用CFRetain,CFRelease这些方法

            4.不能在使用NSAllocateObject和NSDeallocateObject对象

            5.不能在c结构体中使用对象指针,如果有类似功能可以创建一个Objective-c类来管理这些对象

            6.在id和void *之间没有简便的转换方法,同样在Objective-c和core Foundation类型之间的转换都需要使用编译器制定的转换函数

            7.不能再使用NSAutoreleasePool对象,ARC提供了@autoreleasepool块来代替它,这样更加有效率

            8.不能使用内存存储区(不能再使用NSZone)

            9.不能以new为开头给一个属性命名

            10.声明outlet时一般应当使用weak,除了对StoryBoard 这样nib中间的顶层对象要用strong

            11.weak 相当于老版本的assign,strong相当于retain

  • 相关阅读:
    webpack-dev-server
    python 基础语言 学习笔记
    react 避免重复渲染
    获取cookie
    解决 canvas 在高清屏中绘制模糊的问题
    h5页面点击事件ios没反应 移动端兼容性问题
    rem 刷新闪烁问题
    谷歌禁止input自动填充表单信息
    react 循环产生定时器
    IOS开发-UI学习-UIWebView,简单浏览器的制作
  • 原文地址:https://www.cnblogs.com/cnsec/p/11515872.html
Copyright © 2011-2022 走看看