頭と尻尾はくれてやる!

パソコンおやじのiPhoneアプリ・サイト作成・運営日記


UIViewのdrawRect:で意外にメモリ使ってた

作っているiPadアプリがなぜか落ちちゃう、、、アプリ終了だけではなくてリンゴマークまで出てくる。
もう、しょうがないなあiOS 7は、なんて最初は思っていたけどこういうのはたいてい自分が悪くて、今回もやっぱりそうだったんだよね。ごめんなさい。
そもそもメモリの警告も出てたくらいなので、Instruments使って調べてみたら意外なことにUIViewオブジェクトで妙にメモリを使ってる。
1画面で24MBも使ってるとか。実際にはそれを10枚近く重ねて表示してたものだから、それだけでも、、、ってことなのか?
えー?そうなの?1画面のUIViewオブジェクトで24MBってちょっと多過ぎるんじゃない?と思ってシンプルにして調べてみた。
{
    View4 *view = [[[View4 alloc] initWithFrame:self.view.bounds] autorelease];
    [self.view addSubview:view];
}
↑どうということないコードなんだけど、こんな感じでViewControllerのloadView内でUIViewのサブクラスのオブジェクトを生成してaddSubview:する。
この4って数字は単に内部的なモノなので気にしないでね。

このView4クラス内のdrawRect:内で線で三角形を描いてみる。コードはこんな感じ。
- (id)initWithFrame:(CGRect)frame
{
    self = [super initWithFrame:frame];
    if (self) {
        self.backgroundColor = [UIColor colorWithWhite:0.9 alpha:1];
    }
    return self;
}

- (void)drawRect:(CGRect)rect
{
    CGContextRef context = UIGraphicsGetCurrentContext();
    CGContextSetRGBStrokeColor(context, 0.3, 0.3, 0.3, 0.5);
    CGContextSetLineWidth(context, 0.5f);
    CGContextMoveToPoint(context, 10, 100);
    CGContextAddLineToPoint(context, 300, 100);
    CGContextAddLineToPoint(context, 160, 400);
    CGContextAddLineToPoint(context, 10, 100);
    CGContextStrokePath(context);
}
スクリーンショット

メモリはどんなもんかな?とInstrumentで見てみると、、、

Instrumentsによるメモリ消費量

え?12MB?結構使うのね、、、
ちなみにこれをiPhone(4inch Retina)だと2.78MBか。
この違いはiPadの画面サイズ?

1024*768 / 320*568 = 4.326…
12/2.78 = 4.316...
なるほど、画面サイズがでかいとその分メモリ使うみたい。

さらにInstrument見ながら「え?」ってなったのが、Viewクラス内の
- (void)drawRect:(CGRect)rect
メソッドなんだけど、このメソッド全てをコメントアウトすれば12MBのメモリ消費が消えるのよ。
- (void)drawRect:(CGRect)rect
{
     //カラ
}
↑このように中身がカラでも12MB使われてる。え?そういうものなの?

Viewクラス内にラベルやボタンを置くだけでdrawRect:を使わないならさほどメモリは消費しないけど、drawRect:メソッドを使う場合は案外(特にiPadだと)メモリを使っちゃうみたい。

で、どうしたかというと、UIViewのサブクラスではなく、CALayerを使うことにしたのよ。
CALayerのサブクラスの
- (void)drawInContext:(CGContextRef)context
メソッド内で描画をすればiPadでも3.00MBになってたよ。これでやってみようっと。

<< CALayerはタッチイベントを取得できない  TopPage  2014年の運勢 >>

コメント


管理者にだけ表示を許可する
 

トラックバック

トラックバックURL
http://ringsbell.blog117.fc2.com/tb.php/847-4ceec835




Copyright ©頭と尻尾はくれてやる!. Powered by FC2 Blog. Template by eriraha.

FC2Ad