忍者ブログ

佐崎司と愉快な仲間達

ゲーム、アニメ、CG、iOS開発など思いついたことを記事にしています。 管理人が3人いますので、記事にまとまりはないと思います。 iPhoneアプリのレビュー依頼も受け付けています。

UIGraphicsBeginImageContextはスレッドセーフ

わか

ネットで調査していると古い情報もあって混乱しがちです。
そのうちの一つに、UIGraphicsBeginImageContextは昔はスレッドセーフではなく、メインスレッドで呼びださなければならなかったようです。なのでその旨記載してあるサイトが結構存在し、混乱しがちです。
実際にAppleの公式ドキュメントを読めば「This function may be called from any thread of your app.」と記載されており、全てのスレッドから呼び出せると記載されています。
備忘録でした。

拍手[0回]

PR

CGContextDrawPDFPageでメモリリーク発生

わか

CGContextDrawPDFPageを使用するとpdfファイルの内の画像をコンテキストにレンダリングできます。iOS8.4にて使用したところ、必ずメモリリークする現象が発生しました。
CGPDFPageReleaseやCGPDFDocumentReleaseを使用してメモリを解放していますが発生するようです。いろいろ調査しましたが、直らず。

iOS6.0未満ではメモリリークが発生する不具合があったそうですが、今は直っているとの情報もあります。またiOS8.0以上で同様の現象が他の人も発生しているようですが、対処方法に関しては記載されていませんでした。
とりあえずAppleに不具合報告して放置中です。。。

拍手[0回]




ポインタ間が何byte離れているか取得する方法

わか

あるデータファイルを読み込んだ際に、あるポインタ(ptr1)とあるポインタ(ptr2)が判明していて、その間のbyte数を取得したい場合がありました。
今回は複数ポインタのアドレス間が何byte離れているかを取得する方法について記載します。
unsigned long byteNum = (unsigned long)ptr2 - (unsigned long)ptr1;
上記記載方法で取得できます。ptr2がptr1より後である必要がありますが。 備忘録でした。

拍手[0回]


NSDataのdataWithBytesNoCopyやinitWithBytesNoCopyのfreeWhenDoneの意味

わか

NSDataのdataWithBytesNoCopyやinitWithBytesNoCopyメソッドのfreeWhenDoneについて記載します。dataWithBytesNoCopyやinitWithBytesNoCopyとは指定したデータ用メモリからNSDataを生成するメソッドです。メモリを再利用することができるので、無駄なコピーが発生せず効率的です。
ただ、使用する際にはメモリ解放処理を生成したNSDataに任せるか、指定したデータ用メモリに任せるかをきちんと決めておかないとエラーになるかもしれません。

引数にfreeWhenDoneが存在します。これを用いて解放処理を誰に任せるか設定できます。
・YES: 生成したNSDataが解放された際に、元のデータ用メモリを解放する
・NO:  生成したNSDataが解放されても、元のデータ用メモリを解放しない

また、引数にfreeWhenDoneを指定しない場合、「YES」が設定されていることになります。
備忘録でした。

拍手[0回]


autoresizingMaskのviewサイズは固定

わか

autoresizingMaskを使用すると回転時のviewのサイズを自動で適切なサイズに変換してくれます。

iPhone5  iOS7.1.1 
autoresizingMaskを設定しているUITableViewのframeサイズを、生成される際の回転位置から生成していました。( Portrait(縦持ち)(320,568)、Landscape(横持ち) (568,320) )
するとLandscape時に画面は真っ黒になりました。
なので、画面サイズを(320,568)に固定すると問題なく表示されました。

画面サイズの変更はautoresizingMaskがやるので、手動で変更してはいけないいうことでしょう。

拍手[0回]


renderInContextのキャッシュをすぐに解放する方法

わか

ARC環境下にてlayerのrenderInContextを使用した後、すぐにキャッシュが解放されない問題が発生しました。しばらくすると解放されましたが、連続で使用した場合、解放される前にメモリ不足で落ちました。
あれこれ調べてみると、UIGraphicsEndImageContextの前にview.layer.contents = nil;を追加するとキャッシュがすぐに解放されるようです。
忘れがちになりそうなので、メモしておきます。

拍手[1回]


Allocationsの見捨てられたメモリについて

わか

instrumentsで見捨てられたメモリについて概要を記載します。

見捨てられたメモリ
メモリリークとは異なる。何らかの理由で確保されたが、使用されていない領域のこと。
実装を中断した中途半端なコードが残っている。データを重複して保存するような箇所がある。Allocationsにてある処理を繰り返して分析する技法「世代分析」して確認する。
Allocationsで検出可能

拍手[0回]


scrollsToTopが効かない場合の対応方法

わか

UIScrollviewにはscrollsToTopプロパティがあり、ステータスバーをタップすると一番上までスクロールする機能があります。デフォルトはYESです。
また、UIScrollviewは「UITableView、UIWebView、UICollectionView、UITextView」のsubviewsに含まれます。
今回、scrollsToTopがYESなのにステータスバーをタップしても一番上に移動しなかったので原因と対応方法を記載します。

拍手[0回]