首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >为什么lowercaseString of NSString在发布原始NSString对象之后没有发布?

为什么lowercaseString of NSString在发布原始NSString对象之后没有发布?
EN

Stack Overflow用户
提问于 2014-10-18 01:25:55
回答 1查看 118关注 0票数 0

请检查以下代码:

代码语言:javascript
复制
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);

在非弧项目中运行此代码,输出如下:

代码语言:javascript
复制
strUuid retainCount:1
lowerUuid retainCount:1
lowerUuid:xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx

lowercaseString是NSString的一个属性,其定义是:

代码语言:javascript
复制
@property (readonly, copy) NSString *lowercaseString;

因此,可以合理地推断,如果释放了原始的NSString对象,lowercaseString属性将在NSString的dealloc方法中释放。但是,为什么在上面的代码中,即使在发布了原始的lowerUuid之后,strUuid仍然存在?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2014-10-18 01:36:15

首先,标准免责声明:不要看上去像-retainCount。它对它的使用有很多警告,不能真正相信任何有用的东西。

话虽如此:你的推论并不能描述正在发生的事情。当您向strUuid请求-lowercaseString时,您不会得到某种“子”对象。由此产生的小写字符串是一个完全独立的对象,具有自己的内部保留计数。(可能原始字符串确实保留了对小写字符串的引用,但这不是您所关心的。)

在您的代码片段中,按照标准内存管理约定,一般情况下,[strUuid lowercaseString]语句返回一个“自动释放”对象。因此,即使释放了原始字符串,返回给您的字符串仍然有效:(a)至少在清除自动释放池之前,或者(b)在上次实际访问之后,取决于项目上的ARC状态。

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/26435437

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档