8

画像処理アプリケーションはシミュレーターでは高速に実行されますが、実際のデバイス(iPhone 4GS)では非常に低速です。

「instruments」でアプリケーションを実行すると、次の呼び出しツリーが表示されます。

ここに画像の説明を入力してください

赤い丸内の呼び出しは、メソッドのCPU時間のほとんどすべてを費やすと報告されていることに注意してください。

問題のメソッドは、次のコードを持つクラスメソッド(インスタンスメソッドではありません)です。

@implementation Line2F

+ (CGFloat)signTested:(Point2F *)tested p1:(Point2F *)p1 p2:(Point2F *)p2
{
    return [Line2F signTestedX:tested.x testedY:tested.y
                           p1x:p1.x p1y:p1.y
                           p2x:p2.x p2y:p2.y];
}

+ (CGFloat)signTestedX:(CGFloat)testedX testedY:(CGFloat)testedY
                   p1x:(CGFloat)p1x p1y:(CGFloat)p1y
                   p2x:(CGFloat)p2x p2y:(CGFloat)p2y
{
  return (testedX - p2x) * (p1y - p2y) - (p1x - p2x) * (testedY - p2y);  
}

@end

CPU時間の大部分が費やされている理由を誰かが説明できます[NSObject release][NSObject retain]

4

2 に答える 2

3

より良いものがわからない場合、ARCはメソッドへのすべての引数を保持し、メソッドが終了したときにそれらを解放します(このobjc言語のメーリングリストの電子メールを参照してください)。

必要に応じて、またはの+signTested:p1:p2:いずれかで引数に注釈を付けることで、これを回避できるはずです。__weak__unsafe_unretained

于 2013-03-18T05:19:55.597 に答える
1

まあ、たくさんのものになる可能性があります。FrozenDevilが言うように、それを使用している場合はARCに関連している可能性があります。おそらく、このメソッドは巨大なループ内で異なる時間に呼び出されると思います。弱参照を渡すようにしてください。ただし、もちろん、プロセス全体でそれらが存在することを確認する必要があります。また、自動解放プールに各サイクルを埋め込むループを最適化しようとします。

于 2013-03-18T07:42:42.350 に答える