2012-03-14 16 views
1

マップベースのアプリケーションを開発しました。我々は、マップビュー上に表示データ用のマルチスレッドを実装しました。アプリケーションが長時間(約20分)実行されている間、アプリケーションはメモリ警告レベル-1を表示します。数分後にメモリ警告レベル2を与え、レベル2のアプリケーションがクラッシュするかスリープ状態になる。iPhoneでメモリレベルの警告を処理するにはどうすればよいですか?

私たちは、メモリリーク、ゾンビロットを確認しました。しかし、私たちのアプリケーションにはメモリリークやゾンビはありません。

メモリの警告レベルをどのように処理するかアドバイスしてください。メモリレベルの警告を克服するために、いくつかの線を描いてください。

////更新... 私は私が私のメモリ使用量を増加させるCGContextRefを使用したため、私はドローポリ注釈のために、そのためにマルチスレッドを使用している

CGContextRef context = UIGraphicsGetCurrentContext();

のメモリ使用量の増加を発見しましたいつでも私はそれを呼び出します。

私は次の時間よりも、それを解放した場合、それは誰もが任意のアイデアを持っている場合、私は私を助けるhere.Please私の描画コードをポジショニングしていてくれ

無効なコンテキストエラーを示したので、私はどのようにリリース文脈がわかりません。

-(void) drawRect:(CGRect)rect { 
NVPolylineAnnotation* annotation = self.annotation; 

CGFloat POLYLINE_WIDTH = 9; 

if(annotation.getZoomLevel == 7) { 
    POLYLINE_WIDTH = 1.5; 
} 
else if(annotation.getZoomLevel == 8) { 
    POLYLINE_WIDTH = 2.5; 
} 
else if(annotation.getZoomLevel ==9) { 
    POLYLINE_WIDTH = 3; 
}  
else if(annotation.getZoomLevel ==10) { 
    POLYLINE_WIDTH = 3.4; 
}  
else if(annotation.getZoomLevel == 11) { 
    POLYLINE_WIDTH = 4; 
}  
else if(annotation.getZoomLevel <= 13) { 
    POLYLINE_WIDTH = 4.3; 
} 
else if (annotation.getZoomLevel == 14) { 
    POLYLINE_WIDTH = 5.4; 
} 
else if(annotation.getZoomLevel == 15) { 
    POLYLINE_WIDTH = 8; 
} 


CGContextRef context = UIGraphicsGetCurrentContext(); 
CGContextClearRect(context, rect); 
CGContextSetLineWidth(context, POLYLINE_WIDTH); 
CGContextSetAlpha(context, 0.6);  

for(NSDictionary *route in annotation.routes) { 

    NSString *locations = [route valueForKey:@"Locations"]; 
    double speed = [[route valueForKey:@"Speed"] doubleValue]; 


    if (locations && ([locations length]/16 > 1)) {  

     UIColor *color; 
     if (speed <= 20) { 
      color = [UIColor colorWithRed:222/255.0 green:0/255.0 blue:0/255.0 alpha:1.0]; 
     } 
     else if (speed <= 40) { 
      color = [UIColor colorWithRed:253/255.0 green:91/255.0 blue:2/255.0 alpha:1.0]; 
     } 
     else if (speed <= 60) { 
      color = [UIColor colorWithRed:253/255.0 green:145/255.0 blue:4/255.0 alpha:1.0]; 
     } 
     else if (speed <=80) { 
      color = [UIColor colorWithRed:255/255.0 green:212/255.0 blue:4/255.0 alpha:1.0]; 
     } 
     else if (speed >80) { 
      color = [UIColor colorWithRed:42/255.0 green:176/255.0 blue:39/255.0 alpha:1.0]; 
     } 

     CGContextSetStrokeColorWithColor(context, color.CGColor); 

     for (int i = 0; i <= locations.length - 32; i += 32) { 

      CLLocationCoordinate2D coordinates; 
      coordinates.latitude = hexDecode([locations substringWithRange:NSMakeRange(i, 16)]); 
      coordinates.longitude = hexDecode([locations substringWithRange:NSMakeRange(i+16, 16)]); 

      CGPoint point = [_mapView convertCoordinate:coordinates toPointToView:self]; 

      if (i == 0) 
       CGContextMoveToPoint(context, point.x, point.y); 
      else 
       CGContextAddLineToPoint(context, point.x, point.y); 
     } 
     [self setNeedsDisplay]; 
     CGContextStrokePath(context); 

    } 
} 
context = NULL; 
UIGraphicsEndImageContext();  

}予め

おかげ。

+0

最初に何を試しましたか? ** Googleで最初に**「メモリ警告iOSを処理する」**を検索してください。 –

+0

@ParthBhatt:私はこれを見つけて見つけたhttp://stackoverflow.com/questions/5980636/ios-low-memory-crash-but-very-low-memory-usage – Nit

+0

ViewDidUnload()メソッドですべてのアウトレットを解放します。 –

答えて

1

最初に行う必要があるのは、メモリの増加がどこから来ているかを把握するためにアプリケーションを測定することです。漏れがないかもしれませんが、明らかに記憶の問題があります。メモリの増加の原因を特定するのに役立つツールの1つは、InstrumentsのAllocationsツールです。具体的には、ヒープショット分析と呼ばれる手法を使用して、アプリケーションの成長の原因を絞り込むことができます。詳細については、この投稿をheapshot analysisでチェックアウトしてください。

関連する問題