赋值字符串时关于内存值的变化及释放

当一个 CoreFoundation 类被创建时会发生什么?这时后保留值会是 1
然后使用
__bridge_transfer 转换并赋值到局部 NSString 变量。但这时候因为编译器发现了转换运算,因此它将先保留 Core Foundation 字符串符并存入 NSString 变量,

然后再赋值后释放 Core Foundation 字符串符变量。完美,这样就达成目标了!现在来试试__bridge_retained,这个转换方式会保留等号右边的变量。参考下面范例:

- (BOOL) application:(UIApplication *)application

DevDiv 翻译:kyelup cloudhsu 耐心摩卡 wangli2003j3 xiebaochunDevDiv 校对:laigb kyelup

47

page47image22048 page47image22208

版本 1.0 | 2012 05 02

iOS 5 Programming Cookbook www.devdiv.com 翻译整理

page48image1248 page48image1408 page48image1568

didFinishLaunchingWithOptions:(NSDictionary *)launchOptions{CFStringRef coreFoundationString =CFStringCreateWithCString(CFAllocatorGetDefault(),
"C String",

kCFStringEncodingUTF8);
id unknownObjectType = (__bridge id)coreFoundationString;
CFStringRef anotherString = (__bridge_retained CFStringRef)unknownObjectType;NSString *objCString = (__bridge_transfer NSString *)coreFoundationString;NSLog(@"String = %@", objCString);
objCString = nil;
CFRelease(anotherString);
self.window = [[UIWindow alloc] initWithFrame:
[[UIScreen mainScreen] bounds]];
self.window.backgroundColor = [UIColor whiteColor];
[self.window makeKeyAndVisible];
return YES;
}

这些代码会发生下列状况:
1. 配置一个CoreFoundation字符串符,并存入corefoundationString局部变量。
虽然一个
core Foundation 类,ARC 并不会为其加上存储属性,所以我们必须自行管理内存。当变量被创建时,保留值会是 1
2. 然后将 Core Foundation 字符串符转换为通用类型 id。注意,在这里只是做单纯的转换动作,这边并没

有保存或是放这个对象,所以 unknownObjectType coreFoundationString 两个变量的保留值都是 13. 现在我们保留通用类型 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)。 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值