【发布时间】:2014-10-18 09:43:32
【问题描述】:
请检查以下代码:
CFUUIDRef uuid=CFUUIDCreate(kCFAllocatorDefault);
NSString *strUuid=(NSString *)CFUUIDCreateString(kCFAllocatorDefault,uuid);
NSString *lowerUuid=[strUuid lowercaseString];
NSLog(@"strUuid retainCount:%tu",[strUuid retainCount]);
CFRelease(strUuid);
CFRelease(uuid);
NSLog(@"lowerUuid retainCount:%tu",[lowerUuid retainCount]);
NSLog(@"lowerUuid:%@",lowerUuid);
在非 arc 项目中运行此代码,输出将是:
strUuid retainCount:1
lowerUuid retainCount:1
lowerUuid:xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx
lowercaseString是NSString的一个属性,它的定义是:
@property (readonly, copy) NSString *lowercaseString;
所以可以合理地推断,如果原始的 NSString 对象被释放,那么 lowercaseString 属性就会在 NSString 的 dealloc 方法中被释放。 但是为什么在上面的代码中,即使释放了原始的strUuid,lowerUuid仍然存在?
【问题讨论】:
-
我不认为这是一个合理的推论。
copy属性可能意味着返回的值是原始字符串的副本,并带有它自己的保留计数。
标签: objective-c nsstring