老实说,我无法弄清楚何时释放这些物品。任何人都能引导我朝着正确的方向前进吗?
+ (DrawData*) load {
DrawData *newDrawData = [[DrawData alloc] init];
NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init];
NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
NSString *documentsDirectory = [paths objectAtIndex:0];
NSFileManager *fm = [NSFileManager defaultManager];
BOOL keepLoading = YES;
int curIndex = 0;
while ( keepLoading ) {
BoardData *tmpBoard = [[BoardData alloc] init];
NSString *imageFilename = [[NSString alloc] initWithFormat:@"iCanvas_image_%d.png", curIndex];
NSString *metadataFilename = [[NSString alloc] initWithFormat:@"iCanvas_metadata_%d.txt", curIndex];
NSString *layersFilename = [[NSString alloc] initWithFormat:@"iCanvas_layers_%d.dat", curIndex];
imageFilename = [documentsDirectory stringByAppendingPathComponent:imageFilename];
metadataFilename = [documentsDirectory stringByAppendingPathComponent:metadataFilename];
if ( [fm fileExistsAtPath:imageFilename] && [fm fileExistsAtPath:metadataFilename] ) {
NSString *metadataFile = [[NSString alloc] initWithContentsOfFile:metadataFilename];
NSArray *metadata = [metadataFile componentsSeparatedByCharactersInSet:
[NSCharacterSet whitespaceCharacterSet]];
tmpBoard.drawImageTypeOverlay = [[metadata objectAtIndex:0] intValue];
tmpBoard.brushSize = [[metadata objectAtIndex:1] floatValue];
tmpBoard.brushColorRed = [[metadata objectAtIndex:2] floatValue];
tmpBoard.brushColorGreen = [[metadata objectAtIndex:3] floatValue];
tmpBoard.brushColorBlue = [[metadata objectAtIndex:4] floatValue];
tmpBoard.brushColorAlpha = [[metadata objectAtIndex:5] floatValue];
tmpBoard.isErasing = [[metadata objectAtIndex:6] intValue];
tmpBoard.eraseSize = [[metadata objectAtIndex:7] floatValue];
tmpBoard.isSelected = [[metadata objectAtIndex:8] intValue];
tmpBoard.layers = [NSMutableArray arrayWithContentsOfFile:layersFilename];
[newDrawData addBoard:tmpBoard];
}
else {
keepLoading = NO;
}
[tmpBoard release];
}
[pool release];
return newDrawData;
}
答案 0 :(得分:6)
你应该养成以下习惯:
1)添加到自动释放池
NSString *imageFilename = [[[NSString alloc] initWithFormat:@"iCanvas_image_%d.png", curIndex] autorelease];
OR
2)发送发布消息(完成后使用)
[imageFilename release];
使用此模式声明的变量:
NSString *imageFilename = [[NSString alloc] initWithFormat:@"iCanvas_image_%d.png", curIndex];
基本上是
[[blah alloc] init];
了解详情:http://developer.apple.com/mac/library/documentation/cocoa/Conceptual/MemoryMgmt/
答案 1 :(得分:0)
点2和3在while循环中重复,这可能会增加实际泄漏的数量。