在尝试打印对象的retainCount之后,我得到了2147483647。为什么我会得到这样的结果?应该是1,不是吗?
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 -同样的结果。垃圾回收选项设置为不支持。
发布于 2011-09-08 15:13:40
当涉及到内存管理时,NSString有点特殊。字符串文本(类似于@"foo")实际上是单字符,每个具有相同内容的字符串都是相同的对象,因为它无论如何都不能被修改。由于[NSString new]总是创建一个不能修改的空字符串,所以您总是会得到同一个不能释放的实例(因此是高retainCount)。
试试这个片段:
NSString *string1 = [NSString new];
NSString *string2 = [NSString new];
NSLog(@"Memory address of string1: %p", string1);
NSLog(@"Memory address of string2: %p", string2);您将看到两个字符串具有相同的内存地址,因此是相同的对象。
发布于 2011-09-08 15:10:06
这并不能直接回答您的问题,但是retainCount实际上并不那么有用,不应该用于测试。请看这篇文章来了解细节。什么时候使用-retainCount?
发布于 2011-09-08 16:32:28
虽然NSString是一种奇怪的情况(框架中还有其他情况),但您也可能在其他类中遇到这种情况--这是创建单例对象的方法之一。
在应用程序中,单例只存在一次,非常重要的是,它永远不会发布!因此,它将覆盖NSObject的一些方法,包括(但不限于):
- (id)release {
// Ignore the release!
return self;
}
- (NSUInteger)retainCount {
// We are never going to be released
return UINT_MAX;
}这个对象永远不会被释放,并告诉框架它是一个单例,它有一个可笑的高保留计数。
有关单例对象的更多信息,请查看此链接。
https://stackoverflow.com/questions/7350258
复制相似问题