当一个 CoreFoundation 类被创建时会发生什么?这时后保留值会是 1。
然后使用__bridge_transfer 转换并赋值到局部 NSString 变量。但这时候因为编译器发现了转换运算,因此它将先保留 Core Foundation 字符串符并存入 NSString 变量,
然后再赋值后释放 Core Foundation 字符串符变量。完美,这样就达成目标了!现在来试试__bridge_retained,这个转换方式会保留等号右边的变量。参考下面范例:
- (BOOL) application:(UIApplication *)application
DevDiv 翻译:kyelup cloudhsu 耐心摩卡 wangli2003j3 xiebaochunDevDiv 校对:laigb kyelup
47
版本 1.0 | 2012 年 05 月 02 日
iOS 5 Programming Cookbook www.devdiv.com 翻译整理
didFinishLaunchingWithOptions:(NSDictionary *)launchOptions{CFStringRef coreFoundationString =CFStringCreateWithCString(CFAllocatorGetDefault(), |
kCFStringEncodingUTF8); |
这些代码会发生下列状况:
1. 配置一个CoreFoundation字符串符,并存入corefoundationString局部变量。
虽然一个 core Foundation 类,ARC 并不会为其加上存储属性,所以我们必须自行管理内存。当变量被创建时,保留值会是 1。
2. 然后将 Core Foundation 字符串符转换为通用类型 id。注意,在这里只是做单纯的转换动作,这边并没
有保存或是放这个对象,所以 unknownObjectType 跟 coreFoundationString 两个变量的保留值都是 1。3. 现在我们保留通用类型 id 的变凉,并且存入另一个 Core Foundation 字符串符。这时 coreFoundationString,unknownObjectType 与 anotherString 变量的保留值都是 2,而且存在同一块局部内存。
4. 当我们将 c oreFoundationString 变量透过__bridge_transfer 转换并存入一个 NSString 局部变量中会发生什么?可以确定的是在赋值后 coreFoundationString 会被释放(保留值会从 2 变 1),并且再次被保留(因为局部变量存储属性为 strong,保留值会由 1 变 2)。现在 coreFoundationString,unknownObjectType,anotherString 与objCString 变量的保留值都是 2。
5. 下一站,将objCString变量设为空值(nil),这样做会释放这个变量并且保留值会回到1。所有其他局部变量依然是有效的,因为它们的保留值还是维持在 1。
6. 接下来明确指定释放anotherString变量。
这动作会将对象的保留值由 1 变 0,并且字符串符对象会被释放。这时候就不应该再使用这里的任何变量,因为它们现在都指向一个被释放的对象,除了 objCString 之外,
其他都应该手动设为空值(nil)。