Ios 已分配对象的潜在泄漏
在分析我的cocos2d游戏后,我在代码中得到了一个警告“分配到第525行并存储到'valueString'中的对象可能泄漏”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
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];