2012-05-18 3 views
0

iOS 용 앱을 개발 중입니다. 이것은 게임이다.많은 양의 NSString

게임 화면에서 사용자는 UIImageView에서 서브 클래 싱 된 객체를로드 할 수 있습니다. 게임을 저장하기 위해 메인 뷰의 서브 뷰 배열을 반복하고 XML 문자열을 생성하는이 함수를 개발했습니다. 순간

#pragma mark I/O Functions 
-(NSString *)getXMLFromItemsView:(UIView *)items 
{ 
    int a; 
    NSString *XML = [[[NSString alloc] init] autorelease]; 

    XML = [XML stringByAppendingString:@"<PAGE>"]; 

    for (a=0;a<[items.subviews count];a++) 
    { 
     iItem *item = [items.subviews objectAtIndex:a]; 

     if ([item isKindOfClass:[iItem class]] || [item isKindOfClass:[iText class]]) 
     { 
      NSLog(@"INFO -> Saving...Item Id: %d",item.itemId); 

      XML = [XML stringByAppendingString:@"<ITEM>\n"]; 
      XML = [XML stringByAppendingString:[NSString stringWithFormat:@"\t<CLASS>%@</CLASS>\n",[item class]]]; 

      //OriginalTransform 
      XML = [XML stringByAppendingString:[NSString stringWithFormat:@"\t<originalTransform.a>%f</originalTransform.a>\n",item.originalTransform.a]]; 
      XML = [XML stringByAppendingString:[NSString stringWithFormat:@"\t<originalTransform.b>%f</originalTransform.b>\n",item.originalTransform.b]]; 
      XML = [XML stringByAppendingString:[NSString stringWithFormat:@"\t<originalTransform.c>%f</originalTransform.c>\n",item.originalTransform.c]]; 
      XML = [XML stringByAppendingString:[NSString stringWithFormat:@"\t<originalTransform.d>%f</originalTransform.d>\n",item.originalTransform.d]]; 
      XML = [XML stringByAppendingString:[NSString stringWithFormat:@"\t<originalTransform.tx>%f</originalTransform.tx>\n",item.originalTransform.tx]]; 
      XML = [XML stringByAppendingString:[NSString stringWithFormat:@"\t<originalTransform.ty>%f</originalTransform.ty>\n",item.originalTransform.ty]]; 

      //InitialTransform 
      XML = [XML stringByAppendingString:[NSString stringWithFormat:@"\t<initialTransform.a>%f</initialTransform.a>\n",item.initialTransform.a]]; 
      XML = [XML stringByAppendingString:[NSString stringWithFormat:@"\t<initialTransform.b>%f</initialTransform.b>\n",item.initialTransform.b]]; 
      XML = [XML stringByAppendingString:[NSString stringWithFormat:@"\t<initialTransform.c>%f</initialTransform.c>\n",item.initialTransform.c]]; 
      XML = [XML stringByAppendingString:[NSString stringWithFormat:@"\t<initialTransform.d>%f</initialTransform.d>\n",item.initialTransform.d]]; 
      XML = [XML stringByAppendingString:[NSString stringWithFormat:@"\t<initialTransform.tx>%f</initialTransform.tx>\n",item.initialTransform.tx]]; 
      XML = [XML stringByAppendingString:[NSString stringWithFormat:@"\t<initialTransform.ty>%f</initialTransform.ty>\n",item.initialTransform.ty]]; 

      //OriginalFrame 
      XML = [XML stringByAppendingString:[NSString stringWithFormat:@"\t<originalFrame.x>%f</originalFrame.x>\n",item.originalFrame.origin.x]]; 
      XML = [XML stringByAppendingString:[NSString stringWithFormat:@"\t<originalFrame.y>%f</originalFrame.y>\n",item.originalFrame.origin.y]]; 
      XML = [XML stringByAppendingString:[NSString stringWithFormat:@"\t<originalFrame.w>%f</originalFrame.w>\n",item.originalFrame.size.width]]; 
      XML = [XML stringByAppendingString:[NSString stringWithFormat:@"\t<originalFrame.h>%f</originalFrame.h>\n",item.originalFrame.size.height]]; 

      //zOrder 
      XML = [XML stringByAppendingString:[NSString stringWithFormat:@"\t<zOrder>%d</zOrder>\n",item.zOrder]]; 

      //itemId 
      XML = [XML stringByAppendingString:[NSString stringWithFormat:@"\t<itemId>%d</itemId>\n",item.itemId]]; 

      //itemIdColor 
      XML = [XML stringByAppendingString:[NSString stringWithFormat:@"\t<itemIdColor>%d</itemIdColor>\n",item.itemIdColor]]; 

      //itemIdTexture 
      XML = [XML stringByAppendingString:[NSString stringWithFormat:@"\t<itemIdTexture>%d</itemIdTexture>\n",item.itemIdTexture]]; 

      //itemIdStyle 
      XML = [XML stringByAppendingString:[NSString stringWithFormat:@"\t<itemIdStyle>%d</itemIdStyle>\n",item.itemIdStyle]]; 

      //textureLevel 
      XML = [XML stringByAppendingString:[NSString stringWithFormat:@"\t<textureLevel>%d</textureLevel>\n",item.textureLevel]]; 

      //currentSizePercent 
      XML = [XML stringByAppendingString:[NSString stringWithFormat:@"\t<currentSizePercent>%f</currentSizePercent>\n",item.currentSizePercent]]; 

      //currentRotation 
      XML = [XML stringByAppendingString:[NSString stringWithFormat:@"\t<currentRotation>%f</currentRotation>\n",[item currentRotation]]]; 

      //holdItem 
      XML = [XML stringByAppendingString:[NSString stringWithFormat:@"\t<holdItem>%d</holdItem>\n",item.holdItem]]; 

      //isInverted 
      XML = [XML stringByAppendingString:[NSString stringWithFormat:@"\t<isInverted>%d</isInverted>\n",item.isInverted]]; 

      //isMerged 
      XML = [XML stringByAppendingString:[NSString stringWithFormat:@"\t<isMerged>%d</isMerged>\n",item.isMerged]]; 

      //selectedFrame 
      XML = [XML stringByAppendingString:[NSString stringWithFormat:@"\t<selectedFrame>%@</selectedFrame>\n",item.selectedFrame]]; 

      //mergedFrame 
      XML = [XML stringByAppendingString:[NSString stringWithFormat:@"\t<mergedFrame>%@</mergedFrame>\n",item.mergedFrame]]; 

      //NSLog(@"Item Saved Frame: X:%f Y:%f W:%f H:%f",item.frame.origin.x,item.frame.origin.y,item.frame.size.width,item.frame.size.height); 

      //currentFrame 
      XML = [XML stringByAppendingString:[NSString stringWithFormat:@"\t<currentFrame.x>%f</currentFrame.x>\n",item.frame.origin.x]]; 
      XML = [XML stringByAppendingString:[NSString stringWithFormat:@"\t<currentFrame.y>%f</currentFrame.y>\n",item.frame.origin.y]]; 
      XML = [XML stringByAppendingString:[NSString stringWithFormat:@"\t<currentFrame.w>%f</currentFrame.w>\n",item.frame.size.width]]; 
      XML = [XML stringByAppendingString:[NSString stringWithFormat:@"\t<currentFrame.h>%f</currentFrame.h>\n",item.frame.size.height]]; 

      //currentBounds 
      XML = [XML stringByAppendingString:[NSString stringWithFormat:@"\t<currentBounds.x>%f</currentBounds.x>\n",item.bounds.origin.x]]; 
      XML = [XML stringByAppendingString:[NSString stringWithFormat:@"\t<currentBounds.y>%f</currentBounds.y>\n",item.bounds.origin.y]]; 
      XML = [XML stringByAppendingString:[NSString stringWithFormat:@"\t<currentBounds.w>%f</currentBounds.w>\n",item.bounds.size.width]]; 
      XML = [XML stringByAppendingString:[NSString stringWithFormat:@"\t<currentBounds.h>%f</currentBounds.h>\n",item.bounds.size.height]]; 

      //currentTransform 
      XML = [XML stringByAppendingString:[NSString stringWithFormat:@"\t<currentTransform.a>%f</currentTransform.a>\n",item.transform.a]]; 
      XML = [XML stringByAppendingString:[NSString stringWithFormat:@"\t<currentTransform.b>%f</currentTransform.b>\n",item.transform.b]]; 
      XML = [XML stringByAppendingString:[NSString stringWithFormat:@"\t<currentTransform.c>%f</currentTransform.c>\n",item.transform.c]]; 
      XML = [XML stringByAppendingString:[NSString stringWithFormat:@"\t<currentTransform.d>%f</currentTransform.d>\n",item.transform.d]]; 
      XML = [XML stringByAppendingString:[NSString stringWithFormat:@"\t<currentTransform.tx>%f</currentTransform.tx>\n",item.transform.tx]]; 
      XML = [XML stringByAppendingString:[NSString stringWithFormat:@"\t<currentTransform.ty>%f</currentTransform.ty>\n",item.transform.ty]]; 

      if ([[NSString stringWithFormat:@"%@",[item class]] isEqual:@"iText"]) 
      { 
       XML = [XML stringByAppendingString:[NSString stringWithFormat:@"\t<currentText>%@</currentText>\n",[item text]]]; 

      } 

      XML = [XML stringByAppendingString:@"</ITEM>\n"]; 

     } 
    } 

    if (fondo) 
    { 
     XML = [XML stringByAppendingString:@"<FONDO>\n"]; 

     XML = [XML stringByAppendingString:[NSString stringWithFormat:@"\t<selectedFrame>%@</selectedFrame>",fondo.selectedFrame]]; 
     XML = [XML stringByAppendingString:[NSString stringWithFormat:@"\t<picturePath>%@</picturePath>",fondo.picturePath]]; 

     XML = [XML stringByAppendingString:[NSString stringWithFormat:@"\t<idCurrentColor>%d</idCurrentColor>",fondo.idCurrentColor]]; 
     XML = [XML stringByAppendingString:[NSString stringWithFormat:@"\t<idCurrentTexture>%d</idCurrentTexture>",fondo.idCurrentTexture]]; 
     XML = [XML stringByAppendingString:[NSString stringWithFormat:@"\t<idCurrentStyle>%d</idCurrentStyle>",fondo.idCurrentStyle]]; 
     XML = [XML stringByAppendingString:[NSString stringWithFormat:@"\t<textureLevel>%d</textureLevel>",fondo.textureLevel]]; 

     XML = [XML stringByAppendingString:@"</FONDO>\n"]; 
    } 

    XML = [XML stringByAppendingString:@"</PAGE>"]; 
    NSLog(@"INFO -> ItemsViewXML: %@",XML); 
    return XML; 
} 

반복하는 아이템의 양이 부족한 경우이 방법이 잘 작동> 20. 하지만 50 개가 넘는 항목을 처리해야 할 때 메모리 때문에 앱이 다운됩니다.

계측기를 사용하여이 방법을 디버깅했으며 감지 된 곳에서는 누출이 발생하지 않았지만 많은 양의 RAM을 사용할 때까지 할당이 증가합니다.

문자열 생성시 100MB 이상의 VM이 사용되는 것은 일반적이지 않습니다.

내가 잃어버린 사람이 누구인지 아는 사람이 있습니까?

감사합니다.

답변

1

파트에서 문자열을 작성할 때는 NSMutableString을 사용해야합니다.

NSMutableString *xml = [NSMutableString string]; 
[xml appendFormat:@"....", ...]; 
[xml appendFormat:@"....", ...]; 

그러나이 경우에 당신도

+0

홀리 어머니 쓰레기! 이것은 매력처럼 작동합니다! 대단히 감사합니다 !!!! – NemeSys

2

먼저 NSXMLDocument 등과 같은 적절한 XML 시리얼을 사용할 수 있습니다, 당신은 당 문자열, 현재 작성중인 O (50) 문자열을 생성하지 않습니다 목적. 이는 공간적으로 (메모리 사용량에서 알 수 있듯이) 시간적으로 (시간이 많이 걸릴 것입니다) 매우 비효율적입니다.

은 Mattias˚ 제안을 따르고 데이터를 추가 할 변경할 문자열을 사용하십시오.

보고있는 많은 메모리 부족 문제를 해결할 수 있지만 느려질 수 있습니다.
구문 분석 문자열은 비교적 시간이 많이 소요되고 저장 작업이 가능한 한 빨리 이루어져야합니다.

당신은 기본적으로 오른쪽 객체 계층 구조의 아카이브를 원하는 :

그래서 그냥 증상을 무시하고 문제를 살펴 보자?

맞춤 클래스에는 -initWithCoder:-encodeWithCoder:을 구현하십시오.

귀하의 작업이 후하게 저장 간단

NSData *encodedObjectGraph = [NSKeyedArchiver archivedDataWithRootObject:yourObjectGraphsRootGoesHere]; 
NSError *saveError; 
if ([encodedObjectGraph writeToURL:storeURL options:NSDataWritingAtomic error:&saveError]) 
    return; 

NSLog(@"Uh oh: %@", saveError); 

로하고로드 작업이 단지가된다

NSError *loadError; 
NSData *savedObjectData = [NSData dataWithContentsOfURL:storeURL options:0 error:&loadError]; 
if (!savedObjectData) { 
    NSLog(@"No data at %@: %@", storeURL, loadError); 
    return; 
} 

objectGraphRoot = [NSKeyedUnarchiver unarchiveRootObjectWithData:savedObjectData]; 

(unarchiveRootObjectWithData:는 오토 릴리즈 객체를 반환합니다!)

+0

이것은 객체 직렬화와 같습니다. 맞습니까? 자세한 답변을 주셔서 감사합니다. – NemeSys

+0

예, 이것은 객체 직렬화입니다. – danyowdee

관련 문제