Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/ios/99.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 已分配对象的潜在泄漏_Ios_Memory Leaks_Cocos2d Iphone - Fatal编程技术网

Ios 已分配对象的潜在泄漏

Ios 已分配对象的潜在泄漏,ios,memory-leaks,cocos2d-iphone,Ios,Memory Leaks,Cocos2d Iphone,在分析我的cocos2d游戏后,我在代码中得到了一个警告“分配到第525行并存储到'valueString'中的对象可能泄漏” 525 NSString * valueString=[[[NSString alloc] initWithString:[NSString stringWithFormat:@"%@: %@",kGameTimeeng,[allFunctions getTimeFormat:(int) _timeLimit]]] retain]; if([_languag

分析我的cocos2d游戏后,我在代码中得到了一个警告“分配到第525行并存储到'valueString'中的对象可能泄漏”

525  NSString * valueString=[[[NSString alloc] initWithString:[NSString stringWithFormat:@"%@: %@",kGameTimeeng,[allFunctions getTimeFormat:(int) _timeLimit]]] retain];

    if([_language isEqualToString:@"rus"]){
        [valueString release];
        valueString=[[[NSString alloc] initWithString:[NSString stringWithFormat:@"%@: %@",kGameTimerus,[allFunctions getTimeFormat:(int) _timeLimit]]] retain];
    }    

    id sequence=[CCSequence actions:
                 [CCCallFuncND actionWithTarget: allFunctions selector: @selector(setLabelColor:withIndex:) data:(void*)color],
                 [CCCallFuncND actionWithTarget: allFunctions selector: @selector(setLabelValue:withValue:) data:(NSString*)valueString],
                // [CCCallFuncND actionWithTarget: self selector: @selector(setLabelStroke:withTag:) data:(void*)TagCurentPointsLabelStroke],
                 [CCBlink actionWithDuration:0.5f blinks:2],
                 [CCShow action], 
                 [CCCallFuncND actionWithTarget: allFunctions selector: @selector(setLabelColor:withIndex:) data:(void*)colorAfter],

                 nil];

    [_timeLimitLabel runAction:sequence];
    [valueString release];
所有函数

-(void) setLabelValue:(id) sender withValue:(NSString*) value
{   
    CCLabelTTF *label=(CCLabelTTF *)sender;
    NSString * valueString=[[[NSString alloc] initWithString:[NSString stringWithFormat:@"%@",value]] autorelease];
    [label setString:[NSString stringWithFormat:@"%@",valueString]];
   //[valueString release];
}

你能解释一下为什么吗?

当你对一个对象进行alloc init时,这个对象的retain count已经设置为1,所以你通常不需要保留它。当您在第一个代码示例(
[valueString release];
)末尾释放它时,它的保留计数将为1,因为您在init alloc之后保留了它

我不确定
CCSequence
CCCallFuncND
如何处理有关内存管理的参数,但如果从指示行中删除retain,您应该是安全的


希望这有帮助

当您alloc init一个对象时,该对象的retain count已设置为1,因此您通常不需要保留它。当您在第一个代码示例(
[valueString release];
)末尾释放它时,它的保留计数将为1,因为您在init alloc之后保留了它

valueString = [[[NSString alloc] initWithString:[NSString stringWithFormat:@"%@: %@",kGameTimerus,[allFunctions getTimeFormat:(int) _timeLimit]]] retain];
我不确定
CCSequence
CCCallFuncND
如何处理有关内存管理的参数,但如果从指示行中删除retain,您应该是安全的

希望这有帮助

valueString = [[[NSString alloc] initWithString:[NSString stringWithFormat:@"%@: %@",kGameTimerus,[allFunctions getTimeFormat:(int) _timeLimit]]] retain];
您在此处保留了两次:alloc&retain。然后只发布一次:

[valueString release];
这就是为什么会有潜在的泄漏(实际上是泄漏)

以及

NSString * valueString = [[[NSString alloc] initWithString:[NSString stringWithFormat:@"%@",value]] autorelease];
当不再需要
valueString
时,可以保留一次(alloc),然后释放(
autorelease
)。这没关系

525 if([_language isEqualToString:@"rus"]){
        [valueString release];
        valueString=[[[NSString alloc] initWithString:[NSString stringWithFormat:@"%@: %@",kGameTimerus,[allFunctions getTimeFormat:(int) _timeLimit]]] autorelease];
    } else {    
        NSString * valueString=[[[NSString alloc] initWithString:[NSString stringWithFormat:@"%@: %@",kGameTimeeng,[allFunctions getTimeFormat:(int) _timeLimit]]] autorelease];
    }


    id sequence=[CCSequence actions:
                 [CCCallFuncND actionWithTarget: allFunctions selector: @selector(setLabelColor:withIndex:) data:(void*)color],
                 [CCCallFuncND actionWithTarget: allFunctions selector: @selector(setLabelValue:withValue:) data:(NSString*)valueString],
                // [CCCallFuncND actionWithTarget: self selector: @selector(setLabelStroke:withTag:) data:(void*)TagCurentPointsLabelStroke],
                 [CCBlink actionWithDuration:0.5f blinks:2],
                 [CCShow action], 
                 [CCCallFuncND actionWithTarget: allFunctions selector: @selector(setLabelColor:withIndex:) data:(void*)colorAfter],

                 nil];

    [_timeLimitLabel runAction:sequence];
您在此处保留了两次:alloc&retain。然后只发布一次:

[valueString release];
这就是为什么会有潜在的泄漏(实际上是泄漏)

以及

NSString * valueString = [[[NSString alloc] initWithString:[NSString stringWithFormat:@"%@",value]] autorelease];

当不再需要
valueString
时,可以保留一次(alloc),然后释放(
autorelease
)。这没关系。

在allFunctions.m中,您应该释放字符串。然而,在这种情况下,我会将字符串放在极光中。使用自动释放而不是释放,不要释放它。另外(但不应该与警告相关)我会将第535行移到if的else分支中。。。rus语句。对不起,在所有函数中。m您已经自动删除了它。我忽略了这一点。在allFunctions.m中,应该释放字符串。然而,在这种情况下,我会将字符串放在极光中。使用自动释放而不是释放,不要释放它。另外(但不应该与警告相关)我会将第535行移到if的else分支中。。。rus语句。对不起,在所有函数中。m您已经自动删除了它。我忽略了这一点。没关系。@AlexanderSharunov欢迎您!顺便说一句,如果您不熟悉内存管理,可以尝试使用:@亚历山大·沙鲁诺夫欢迎你!顺便说一句,如果您不熟悉内存管理,可以尝试使用:
525 if([_language isEqualToString:@"rus"]){
        [valueString release];
        valueString=[[[NSString alloc] initWithString:[NSString stringWithFormat:@"%@: %@",kGameTimerus,[allFunctions getTimeFormat:(int) _timeLimit]]] autorelease];
    } else {    
        NSString * valueString=[[[NSString alloc] initWithString:[NSString stringWithFormat:@"%@: %@",kGameTimeeng,[allFunctions getTimeFormat:(int) _timeLimit]]] autorelease];
    }


    id sequence=[CCSequence actions:
                 [CCCallFuncND actionWithTarget: allFunctions selector: @selector(setLabelColor:withIndex:) data:(void*)color],
                 [CCCallFuncND actionWithTarget: allFunctions selector: @selector(setLabelValue:withValue:) data:(NSString*)valueString],
                // [CCCallFuncND actionWithTarget: self selector: @selector(setLabelStroke:withTag:) data:(void*)TagCurentPointsLabelStroke],
                 [CCBlink actionWithDuration:0.5f blinks:2],
                 [CCShow action], 
                 [CCCallFuncND actionWithTarget: allFunctions selector: @selector(setLabelColor:withIndex:) data:(void*)colorAfter],

                 nil];

    [_timeLimitLabel runAction:sequence];