2

わかった。私は答えを探しています、そしてそれを自分で見つけるかもしれません。私には自分の質問に答えるという厄介な癖があります。

いずれにせよ、かなり簡単に「スキニング」できるように設計されたアプリがあります。その一環として、バリアントに固有の静的クラスにメソッドを隔離しました。これらの静的メソッドは、バリアントに固有のメイン アプリの画像、色、および設定をフィードします。.h ファイルはメイン アプリに共通ですが、.m ファイルはバリアントに固有です。

私は画像を背景として送信する機能 (自動的にタイル化されます) を使用するのが好きなので、インターフェイス ファイルは次のように UIColor を返すようにルーチンを指定します。

+ (UIColor *)meetingDetailBackgroundColor;

しかし、実装ファイルは画像ファイルをロードし、次のように返します。

+ (UIColor *)meetingDetailBackgroundColor
{
    return [UIColor colorWithPatternImage:[UIImage imageNamed:@"DarkWeave.png"]];
}

次のように、コンテキストで使用されます。

[[self view] setBackgroundColor:[BMLTVariantDefs meetingDetailBackgroundColor]];

注:私が使用した元の単純なコードを復元するために編集されました。

さて、問題は、時々(常にではありませんが)リークが発生することです。

私はここで何か厄介なことをしていると確信しています。よくわかりません。

何か案は?

ところで: これは、IOS 5 で実行される ARC プログラムです。

4

3 に答える 3

7

UIColor colorWithPatternImageバグがあります。使用しないでください。私の経験では、デバイスではパフォーマンスが大幅に低下する傾向がありますが、シミュレーターではそうではありません。その上でのスクロールやアニメーションなどは遅くなる傾向があります。これが本当にリークと見なされるかどうかはわかりません.RAMが不足したためにアプリが強制終了されたわけではありません. UIColor colorWithPatternImageしかし、アプリをプロファイリングすると、何かを有効にして描画すると、アプリの実行速度が大幅に低下することがわかります。

最終的に のサブクラスを作成し、次のUIViewようにしました。

- (void)drawRect:(CGRect)rect
{
    CGContextRef c = UIGraphicsGetCurrentContext();
    CGContextSetBlendMode(c, kCGBlendModeCopy);
    CGContextDrawTiledImage(c, CGRectMake(0, 0, bkgnd.size.width, bkgnd.size.height), bkgnd.CGImage);
}

これにより、画像がタイル表示されます。次に、self.tableView.backgroundViewまたは[self.view insertSubview:bkgnd atIndex:0]を使用して背景にします。デバイス上でより高速に実行され、メモリ リークは発生しません。

于 2012-04-06T14:18:53.920 に答える
3

共有色を初期化する最良の方法は次のとおりです。

+ (UIColor *)color
{
    static UIColor *color;
    static dispatch_once_t onceToken;
    dispatch_once(&onceToken, ^{
        color = [[UIColor alloc] init...];
    });
    return color;
}

スレッドセーフで、色を一度だけ初期化します。そうすれば、色が漏れることはありません。

于 2012-04-06T15:56:52.077 に答える
0

わかった。私はこれに対処しましたが、修正しませんでした。

パントしました。

それは確かに、ワイルドな推測をしているインストゥルメントです。色を指定する方法に問題はありませんでした (ただし、ここでの提案の 1 つが気に入り、その方法で色指定をやり直しました)。

これは非常に小さなリークのようで、MapKit の腸の奥深く (つまり、文字通りの意味) に埋もれています。それを解決するために私にできることは絶対にないようです。

レンガの壁と新皮質のやり取りを数時間行った後、私はあきらめて、スクリーン コントローラー オブジェクトを再利用可能にしました。ぶらぶらしているだけで、視察する会議に合わせて内容を変えています。

これにより、アプリが閉じるまでリークが延期されます。

私はそのような弱虫です。

ありがとう。

于 2012-04-07T12:28:37.880 に答える