• ベストアンサー
※ ChatGPTを利用し、要約された質問です(原文:iPadでpdfファイルを表示/拡大縮小する)

iPadでpdfファイルを表示/拡大縮小する

このQ&Aのポイント
  • iOSのプログラミングを学習中の方向けの、iPadでpdfファイルを表示/拡大縮小する方法について解説します。
  • pdfファイルを表示/拡大縮小する際に発生するメモリリークの問題について、参照カウンタの挙動を分析しました。
  • 提供されたプロジェクトのソースコードを使用して、pdfの表示/拡大縮小時のメモリ使用量を最適化する方法を解説します。

質問者が選んだベストアンサー

  • ベストアンサー
  • harawo
  • ベストアンサー率58% (3742/6450)
回答No.2

> releaseとremoveSuperViewを試してみたのですが、今度は画面の散らつきとランダムでアプリが終了する状態になりました。 リリースされたインスタンスに、アクセスしている状態ではないですか? > 参照カウンタはremoveSuperView→releaseで2→0になり、nilを入れた後で再度同じ変数に対してinitWithFrameを使って再利用している状態です。 Retain Countが0を取得することはありえません。なぜなら、バッファを開放したインスタンスにアクセスしたら、それが「retainCount」メソッドであっても、例外が発生するからです。Retain Countが0を取得するのは、インスタンス変数にnilを代入した直後のみです。 Viewを生成したら、autoreleaseするか、addSubviewした直後にreleaseする。 removeFromSuperviewすると、autoreleaseしたのと同じ状態になるので、あとはAutorelease Poolが適切に開放処理してくれるのに任せる。 この2点をおさえておけば、ほかの処理は不要だし、よかれと思ったことが徒になる危険のほうが高くなるでしょう。 なお、autoreleaseすると、Retain Countは、意味のある数値を返さなくなります。値が1以上であっても、バッファが保持されていることを示しません。

その他の回答 (1)

  • harawo
  • ベストアンサー率58% (3742/6450)
回答No.1

> ただ、なぜ参照カウンタがinitWithFrame呼び出し終了時は1なのに対し、retain等を行っていないのに参照カウンタが2になっているかが分からない次第です。 メソッド「renew_page」内で、「addSubview:」を行ったあとで、サブビューにreleaseを行っていませんね? UIViewクラスのリファレンス「addSubview:」から引用: Parameters view The view to be added. This view is retained by the receiver. After being added, this view appears on top of any other subviews. addSubviewすると、Retain Countが1増えます。(removeFromSuperViewでは、Retain Countが1減ります) なので、addSubviewしたViewは、直後releaseを送るか、あらかじめ「autorelease」しておきます。 これは、NSArrayクラスが要素を追加したとき、要素オブジェクトをRetainするというふるまいに起因します。そのことを理解しておけば、ぎゃくにうまくメモリ管理を行うテクニックとして使えるんじゃないですかね?

voyager2007
質問者

補足

回答ありがとうございます。 addSubView後にreleaseするプログラムもあれば、しないプログラムもあったので盲点でした。 releaseとremoveSuperViewを試してみたのですが、今度は画面の散らつきとランダムでアプリが終了する状態になりました。 参照カウンタはremoveSuperView→releaseで2→0になり、nilを入れた後で再度同じ変数に対してinitWithFrameを使って再利用している状態です。

関連するQ&A