请检查以下代码:
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);
在非弧项目中运行此代码,输出如下:
strUuid retainCount:1
lowerUuid retainCount:1
lowerUuid:xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx
lowercaseString是NSString的一个属性,其定义是:
@property (readonly, copy) NSString *lowercaseString;
因此,可以合理地推断,如果释放了原始的NSString对象,lowercaseString属性将在NSString的dealloc方法中释放。但是,为什么在上面的代码中,即使在发布了原始的lowerUuid之后,strUuid仍然存在?
发布于 2014-10-17 17:36:15
首先,标准免责声明:不要看上去像-retainCount
。它对它的使用有很多警告,不能真正相信任何有用的东西。
话虽如此:你的推论并不能描述正在发生的事情。当您向strUuid
请求-lowercaseString
时,您不会得到某种“子”对象。由此产生的小写字符串是一个完全独立的对象,具有自己的内部保留计数。(可能原始字符串确实保留了对小写字符串的引用,但这不是您所关心的。)
在您的代码片段中,按照标准内存管理约定,一般情况下,[strUuid lowercaseString]
语句返回一个“自动释放”对象。因此,即使释放了原始字符串,返回给您的字符串仍然有效:(a)至少在清除自动释放池之前,或者(b)在上次实际访问之后,取决于项目上的ARC状态。
https://stackoverflow.com/questions/26435437
复制相似问题