首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >retainCount显示MaxInt

retainCount显示MaxInt
EN

Stack Overflow用户
提问于 2011-09-08 15:06:00
回答 4查看 830关注 0票数 6

在尝试打印对象的retainCount之后,我得到了2147483647。为什么我会得到这样的结果?应该是1,不是吗?

代码语言:javascript
复制
NSString *myStr = [NSString new];
NSUInteger retCount = [myStr retainCount];
NSLog(@"refCount = %u", retCount);

2011-09-08 17:59:18.759测试51972:207 refCount = 2147483647

我使用的是XCode版本4.1。尝试编译GCC 4.2和LLVM GCC 4.2 -同样的结果。垃圾回收选项设置为不支持。

EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2011-09-08 15:13:40

当涉及到内存管理时,NSString有点特殊。字符串文本(类似于@"foo")实际上是单字符,每个具有相同内容的字符串都是相同的对象,因为它无论如何都不能被修改。由于[NSString new]总是创建一个不能修改的空字符串,所以您总是会得到同一个不能释放的实例(因此是高retainCount)。

试试这个片段:

代码语言:javascript
复制
NSString *string1 = [NSString new];
NSString *string2 = [NSString new];
NSLog(@"Memory address of string1: %p", string1);
NSLog(@"Memory address of string2: %p", string2);

您将看到两个字符串具有相同的内存地址,因此是相同的对象。

票数 15
EN

Stack Overflow用户

发布于 2011-09-08 15:10:06

这并不能直接回答您的问题,但是retainCount实际上并不那么有用,不应该用于测试。请看这篇文章来了解细节。什么时候使用-retainCount?

票数 12
EN

Stack Overflow用户

发布于 2011-09-08 16:32:28

虽然NSString是一种奇怪的情况(框架中还有其他情况),但您也可能在其他类中遇到这种情况--这是创建单例对象的方法之一。

在应用程序中,单例只存在一次,非常重要的是,它永远不会发布!因此,它将覆盖NSObject的一些方法,包括(但不限于):

代码语言:javascript
复制
- (id)release {
    // Ignore the release!
    return self;
}

- (NSUInteger)retainCount {
    // We are never going to be released
    return UINT_MAX;
}

这个对象永远不会被释放,并告诉框架它是一个单例,它有一个可笑的高保留计数。

有关单例对象的更多信息,请查看此链接

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

https://stackoverflow.com/questions/7350258

复制
相关文章

相似问题

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