Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/redis/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
ios:保留2147483647的计数?_Ios_Count_Retain - Fatal编程技术网

ios:保留2147483647的计数?

ios:保留2147483647的计数?,ios,count,retain,Ios,Count,Retain,可能的重复项: 请查看以下代码: NSString* testString = [[NSString alloc] initWithString:@"Test"]; NSLog(@"[testString retainCount] = %d", [testString retainCount] ); NSMutableArray* ma = [[NSMutableArray alloc] init]; [ma insertObject:testString atIndex:0]; [test

可能的重复项:

请查看以下代码:

NSString* testString = [[NSString alloc] initWithString:@"Test"];
NSLog(@"[testString retainCount] = %d", [testString retainCount] );
NSMutableArray* ma = [[NSMutableArray alloc] init];
[ma insertObject:testString atIndex:0];
[testString release];
NSLog(@"%@", [ma objectAtIndex:0]);
这是控制台上的输出:

[testString retainCount] = 2147483647
Test

这怎么会发生?我以为不是2147483647

使用字符串文本启动NSString对象,会发生以下两种情况:

  • 由于NSString是不可变的-initWithString:方法优化字符串创建,以便您的testString实际指向您使用(@“Test”)创建它的同一个字符串
  • @“Test”是一个字符串文本,它是在编译时创建的,存在于特定的地址空间中-您无法解除锁定它,release和retain不会影响它的retain计数,它始终为INT_MAX

  • 有了以上提到的所有内容,您仍然应该按照内存管理规则使用字符串对象(当您使用alloc/init创建它时,您应该释放它),您会很好的

    对于重新计数的结果,您只能有两个期望:

    1) 它大于1。你无法预测它的实际数量,因为你不知道还有谁在使用它。你不知道别人是怎么用的。这不是一个你应该关心的数字

    2) 人们会告诉你不要使用它。因为你不应该。使用这些规则来平衡保留和释放。不要使用重新计数。它会让你感到沮丧和困惑,毫无价值。

    无论如何。。。及