IT博客汇
  • 首页
  • 精华
  • 技术
  • 设计
  • 资讯
  • 扯淡
  • 权利声明
  • 登录 注册

    arc+blocks+llvm4 的时代1/3

    Di Wu发表于 2012-12-24 14:56:00
    love 0

    ARC

    ARC(Automatic Reference Counting) 到现在已经出来一年有余,越来越多的团队已经体会到他的好处。曾和同行们讨论过新手是否有必要深入学习手动内存管理。个人认为从arc开始的成本要低很多,而且能编译出强壮的代码,何乐不为?

    什么是手动内存管理

    如果需要持有一个对象,那么对其发送retain 如果之后不再使用该对象,那么需要对其发送release(或者autorealse) 每一次对retain,alloc或者new的调用,需要对应一次release或autorealse调用

    自动内存管理

    自动内存其实也简单

    在你的工程中使用 ARC 非常简单。你还像往常一样编程,只是不再调用 retain,release 和 autorelease 了。

    生命周期

    __strong

    变量声明缺省都带有__strong关键字,如果变量什么关键字都不写,那么缺省就是强参照。

    __weak

    该概念是新特性,从 iOS 5/ Mac OS X 10.7 开始导入。由于该类型不影响对象的生命周期,所以如果对象之前就没有持有者,那么会出现刚创建就被破弃的问题,比如下面的代码。

    1
    2
    
    NSString __weak *string = [[NSString alloc] initWithFormat:@"First Name: %@", [self firstName]];
    NSLog(@"string: %@", string);
    

    以上是一个__weak的例子,由于string没有赋值给任何变量,所以这里返回值是null

    __unsafe_unretained

    该关键字与weak一样,也是弱参照,与weak的区别只是是否执行nil赋值(Zeroing)。但是这样,需要注意变量所指的对象已经被破弃了,地址还还存在,但内存中对象已经没有了。如果还是访问该对象,将引起「BAD_ACCESS」错误。

    自动给释放池

    使用ARC,你不能使用NSAutoReleasePool类来管理自动释放池了,作为替代,ARC使用一个新的语法结构:

    1
    2
    3
    
    @autoreleasepool {
         // Code, such as a loop that creates a large number of temporary objects.
    }
    

    ARC 代码自动变换

    另外,Xcode 4.2开始,增加了旧代码向 ARC 代码自动转换的功能。有兴趣的朋友可以试试。位置是:

    Edit->Refactor->Convert to Objective-C ARC



沪ICP备19023445号-2号
友情链接