求最近国庆档期羞羞的铁拳 档期百度云

iOS中框架中的ARC代码-(各种修饰符)_ios技术分享吧_百度贴吧
&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&签到排名:今日本吧第个签到,本吧因你更精彩,明天继续来努力!
本吧签到人数:0可签7级以上的吧50个
本月漏签0次!成为超级会员,赠送8张补签卡连续签到:天&&累计签到:天超级会员单次开通12个月以上,赠送连续签到卡3张
关注:24贴子:
iOS中框架中的ARC代码-(各种修饰符)
如果是编写框架,无论是将其开源发布还是共享给公司中的其他团队,你都应该提示使用你的代码的开发人员:这些文件需要使用ARC来编译。在非ARC工程中使用支持ARC的代码会导致内存泄漏,所以你有责任提示开发人员。比如,你可以使用如下所示的宏:123
#if ! __has_feature(objc_arc)
#error This file is ARC only.
这段代码看起来应该很熟悉,因为之前讲解Clang语言扩展的时候谈及过。1. 归零弱引用本章前面部分中我曾说过ARC是编译时的特性,其实远不止这些。从iOS 5和Mac OS X 10.7(Lion)开始,运行时(runtime)便支持了一种称为**归零弱引用**(zeroing weak reference)的特性。弱引用通过持有指针而不关注引用计数的值来避免循环保留(retain cycle)。但是当内存(即指针指向的内存)被销毁后,弱引用指向的将会是无效内容。销毁内存后再访问指针会导致应用崩溃。归零弱引用通过在销毁内存后将指针“归零”的方法解决这个问题。2. 所有权修饰符ARC会自动帮你插入retain和release语句。不过“自动”代码生成器需要一些提示来了解销毁已分配内存的准确时机。ARC通过你指定的所有权修饰符(ownershipqualifier)来确定指针的生命周期。所有权修饰符几乎是ARC中最难弄懂的概念了。理解所有权修饰符之后,你应该以对象图形的方式来思考保留与释放操作。ARC支持4种所有权修饰符:__strong__weak__unsafe_unretained__autoreleasing前面三个也能用在属性声明中。在属性上使用所有权修饰符时不需要双下划线前缀(__)。默认的所有权修饰符(若你没有指定一个的话)是__strong。在Xcode 4.2/LLVM 3中,栈变量的默认所有权修饰符是__strong,属性的则是__assign。而在Xcode 4.3/LLVM 3.1及更高版本中,属性的默认所有权修饰符也被改成了__strong。Xcode 4.3移植工具的移植向导反映了这一点。3. __strong你可以使用以下两种方式指定强所有权:1
__strong NSString* myObject =
@property(nonatomic, strong) NSObject *myO
在声明属性的时候可以使用第二种语法。强所有权与“保留”作用相同,它可以增加引用计数的值。想象一下在ARC中,你可以使用强所有权的引用指向你“拥有”的任何东西。强所有权包括一个视图拥有它的子视图、一个父控制器拥有它的子视图控制器和对象。我曾经说过,__strong是默认的所有权修饰符。你并非必须写出关键字__strong或strong来指定强所有权。之前的两行代码今后你也可以写成下面这样:1
NSString* myObject =
@property(nonatomic) NSObject *myO
4. __unsafe_unretained当你没有指针但想要保存指向某物的引用时,可以使用__unsafe_unretained所有权修饰符。下面的代码展示了这一修饰符的使用:1
__unsafe_unretained UIView* myS
@property(nonatomic, unsafe_unretained) UIView* myS
这一修饰符的常见使用方法是在视图控制器里维持指向子视图的引用。请记住,当你创建了一个视图并使用addSubview:方法将其添加到另一个视图时,父视图便“拥有”了子视图。有时,在视图控制器中你可能想要拥有其他指向这个子视图的引用。图5-1展示了一种常见的所有权修饰符模式。一个UITextField文本框被添加为一个UIView视图的子视图,并且UIViewController视图控制器有一个指向(不是拥有)它的引用。图5-1 UITextField的所有权你可以在多种类似场合使用__unsafe_unretained,包括维持指向委托的引用。对属性使用__unsafe_unretained等同于优先于ARC使用分配(assign)修饰符。5. __weak__weak修饰符的作用与__unsafe_unretained修饰符非常相似,只是当指针指向的内容被销毁后,弱指针便会成为空值(nil)。当然,这也需要运行时的支持。此外,弱引用仅支持iOS5及以上的系统。与ARC不同,弱引用不是编译时的设置。部署运行时需要支持归零弱引用。如果你想部署的目标设备版本低于iOS 5.0,便无法使用弱引用。如果目标设备不支持归零弱引用,Xcode的Convert to Objective-C ARC移植工具会将你的“assign”修饰符转换成__unsafe_unretained,而非__weak。弱引用的用法与__unsafe_unretained相似。只要运行时支持归零弱引用,便可以在能够使用__unsafe_unretained修饰符的地方使用弱引用。6. __auto_releasing__auto_releasing所有权修饰符可以在你想要从方法返回一个自动释放(auto-released)变量时使用。在方法中分配的NSError对象会通过指向使用了__auto_releasing所有权的指针返回到调用者中。这个修饰符与其他3个有个重要区别,就是__auto_releasing无法用在属性上。所有权修饰符与常量修饰符不同,它是位置无关(position-independent)的。因此__weak NSObject* myO和NSObject __weak *myO意义是一样的。这是因为ARC的所有权修饰符是对指针起作用的(而不是指向的值,这与常量修饰符不同)。LLVM编译器因此可以猜到你的想法。
贴吧热议榜
使用签名档&&
保存至快速回贴

我要回帖

更多关于 羞羞的铁拳百度云下载 的文章

 

随机推荐