Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/objective-c/26.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
Iphone NSString stringWithFormat调用XX次会导致内存警告_Iphone_Objective C_Memory Management_Memory Leaks_Nsstring - Fatal编程技术网

Iphone NSString stringWithFormat调用XX次会导致内存警告

Iphone NSString stringWithFormat调用XX次会导致内存警告,iphone,objective-c,memory-management,memory-leaks,nsstring,Iphone,Objective C,Memory Management,Memory Leaks,Nsstring,我开始使用下面介绍的技术监控应用程序内存使用情况: 我写了3个测试来尝试,我发现: - (void)test1 { for (int i = 0; i < 1000; i++) { NSMutableString *str = [NSMutableString stringWithString:@""]; for (int j = 0; j < 1000; j++) { [str appendString:@"some really long str

我开始使用下面介绍的技术监控应用程序内存使用情况:

我写了3个测试来尝试,我发现:

- (void)test1 {
for (int i = 0; i < 1000; i++) {
    NSMutableString *str = [NSMutableString stringWithString:@""];
    for (int j = 0; j < 1000; j++) {
        [str appendString:@"some really long string some really long string some really long string some really long string some really long string some really long string some really long string some really long string some really long string some really long string some really long string some really long string some really long string some really long string some really long string some really long string "];
    }
}    

- (void)test2 {
for (int i = 0; i < 100000; i++) {
    @autoreleasepool {
        NSString *stri = @"";
        stri = [NSString stringWithFormat:@"%d some really long string some really long string some really long string some really long string some really long string some really long string some really long string some really long string some really long string some really long string some really long string some really long string some really long string some really long string some really long string some really long string some really long string some really long string some really long string some really", i];
    }
}


- (void)test3 {
NSString *str = @"";
for (int i = 0; i < 500; i++) {
    str = [str stringByAppendingFormat:@"%d some really long string some really long string some really long string some really long string some really long string some really long string some really long string some really long string some really long string some really long string some really long string some really long string some really long string some really long string some really long string some really long string some really long string some really long string some really long string some really", i];
}
-(void)test1{
对于(int i=0;i<1000;i++){
NSMutableString*str=[NSMutableString stringWithString:@'';
对于(int j=0;j<1000;j++){
[str追加字符串:@"一些非常长的字符串一些非常长的字符串一些非常长的字符串一些非常长的字符串一些非常长的字符串一些非常长的字符串一些非常长的字符串一些非常长的字符串一些非常长的字符串一些非常长的字符串一些非常长的字符串一些非常长的字符串一些非常长的字符串一些非常长的字符串一些非常长的字符串ong字符串一些非常长的字符串“];
}
}    
-(无效)测试2{
对于(int i=0;i<100000;i++){
@自动释放池{
NSString*stri=@;
stri=[NSString stringWithFormat:@”%一些非常长的字符串一些非常长的字符串一些非常长的字符串一些非常长的字符串一些非常长的字符串一些非常长的字符串一些非常长的字符串一些非常长的字符串一些非常长的字符串一些非常长的字符串一些非常长的字符串一些非常长的字符串一些非常长的字符串一些非常长的字符串y长串一些非常长的串一些非常长的串一些非常长的串一些非常长的串一些非常长的串一些非常“i];
}
}
-(无效)测试3{
NSString*str=@;
对于(int i=0;i<500;i++){
str=[str stringByAppendingFormat:@”%一些非常长的字符串一些非常长的字符串一些非常长的字符串一些非常长的字符串一些非常长的字符串一些非常长的字符串一些非常长的字符串一些非常长的字符串一些非常长的字符串一些非常长的字符串一些非常长的字符串一些非常长的字符串一些非常长的字符串一些非常长的字符串y长串一些非常长的串一些非常长的串一些非常长的串一些非常长的串一些非常长的串一些非常“i];
}
当我调用test1或test3时,内存被正确分配和释放-我可以使用上面链接中描述的report_memory函数看到它。 但当我调用test2时,内存并没有被释放-报告内存会不断增加。如果我多次调用test2,我的应用程序会收到内存警告并被终止


我使用的是ARC。有人能解释一下这里发生了什么吗?

这是因为在每次迭代中都使用单独的自动释放实例。第一种情况是,您有一个名为
str
的对象,并附加到同一个实例。这就是内存没有泄漏的原因

试着像这样改变通话,然后检查

- (void)test2 
{
    NSString *str = @"";
    for (int i = 0; i < 100000; i++) 
    {
       str = [str stringByAppendingFormat:@"%d some really long string some really long string some really long string some really long string some really long string some really long string some really long string some really long string some really long string some really long string some really long string some really long string some really long string some really long string some really long string some really long string some really long string some really long string some really long string some really", i];
    }
}
-(void)test2
{
NSString*str=@;
对于(int i=0;i<100000;i++)
{
str=[str stringByAppendingFormat:@”%一些非常长的字符串一些非常长的字符串一些非常长的字符串一些非常长的字符串一些非常长的字符串一些非常长的字符串一些非常长的字符串一些非常长的字符串一些非常长的字符串一些非常长的字符串一些非常长的字符串一些非常长的字符串一些非常长的字符串一些非常长的字符串y长串一些非常长的串一些非常长的串一些非常长的串一些非常长的串一些非常长的串一些非常“i];
}
}

stringWithFormat返回一个自动释放的NSString对象。因此,在该线程结束时释放自动释放池时,该对象将被释放。

搞定了!!!我启用了僵尸对象并忘记了它们,因此即使在使用@autoreleasepool块时,也不会释放任何分配的对象。

where您是否正在使用stringWithFormat的结果…如NSString*str=[NSString stringWithFormat:@”“];那么,为什么你在不使用stringWithFormat的情况下还要编写stringWithFormat呢?苹果公司有大量的文档解释,如果你在一个紧密的循环中创建了许多自动释放池,那么如何排空自动释放池;找到了!!!我启用了僵尸对象,但忘记了它们,因此即使在我使用@autoreleasepool bl时,也没有释放任何分配的对象ock.1.我使用NSTimer更新内存使用情况,以便在不同的事件循环中更新内存使用情况。2.我使用UIButton多次调用test2-这里也有不同的事件循环。感谢您的建议-这对I<500有效。我更新了我的问题,它仍然是开放的。