4

グラフに2つの異なるビューがあるARCを有効にしてグラフ関連のアプリを構築しています:-1つはボタンをクリックして変更する必要がある小さなビューです(データのリロードを使用)。-2番目のビューは、「1日」、「3日」、「5日」などのボタンをクリックするとグラフが変化する大きなビューです。

私が直面している問題は、15 ~ 20 分間連続して使用した後、アプリケーションがログでクラッシュすることです....「CAAnimation はバイトの割り当てに失敗しました」。プロファイルを分析すると、小さなグラフがライブ バイトをロードすると 2 ~ 3 mb ジャンプし、大きなグラフがライブ バイトをロードすると 4 ~ 5 mb ジャンプし、ライブ バイトがダウンしないことがわかりました。ビューを離れるときにすべてのグラフ オブジェクトを削除しましたが、それでもメモリは解放されません。

次のグラフに切り替えるときに、このメソッドを呼び出しています。

-(void)removePlot
{
    for(CPTPlot* plot in [graph allPlots])
    {
        plot.dataSource = nil;
        plot.delegate = nil;
        [plot deleteDataInIndexRange:NSMakeRange(0, plot.cachedDataCount)];
        [graph removePlot:plot];
    }
}

そして、ビューを離れるときに、このメソッドを呼び出しています:

-(void)removeGraph
{
    [axisSet removeFromSuperlayer]; 
    axisSet=nil;
    [self removePlot];
    generationPlot=nil;
    [graph removePlotSpace:plotSpace];
    plotSpace=nil;
    [graph removeFromSuperlayer];
    graph=nil;
    [hostView removeFromSuperview];
    hostView=nil;
    headerList=nil;
    graphDetailList=nil;
    graphList=nil;
    dataList=nil;
    plotsArray=nil;
}

多くの人が以前にこの問題に直面しましたが、私にとってはまだ答えがありません。これに関するアイデアがあれば...助けてください。

4

1 に答える 1

0

これを読んでみてください、役に立つかもしれません。

https://developer.apple.com/library/ios/releasenotes/objectivec/rn-transitioningtoarc/introduction/introduction.html

また、最大メモリ フットプリントを制限するために ARC が提供する @autoreleasepool メカニズムを調べることも検討してください。

また、上記のメソッドが呼び出されていることを確認してください。ときどきクリーンアップ ルーチンを作成しますが、呼び出されません。:-)

また、コードを次のようにリストします。

axisSet=nil generationPlot=nil ...etc...

axisSet の型は何ですか? GenerationPlot は何型ですか? グローバル変数?それらが NSObjects でない場合 (場合によってはそうであっても)、それらを nil に設定することは、それらの割り当てを解除する適切な方法ではない可能性があります。

それらのいくつかを @property にして、適切な修飾子 (つまり、strong など) を与えることを検討してください。そうすれば、メモリ使用量の一部が少し明確になる場合があります。いくつかの混乱を引き起こしている可能性のある静的またはグローバルが多数ある場合。

お役に立てれば。

于 2014-03-16T01:07:08.957 に答える