忍者ブログ

佐崎司と愉快な仲間達

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

長いループ処理では@autoreleasepool{}が必要

わか

ARC環境において、whileやforで長い処理を行った場合は@autoreleasepool{}を使用した方が良いです。なぜなら解放待ちのインスタンスが溜まってしまいメモリリークしてしまうからです。
忘れがちになりそうなので、備忘録として記載します。

拍手[0回]

PR

NSURLConnectionのステータスコード401について

わか

iOS8.2

NSURLConnectionのレスポンスを受信した際の認証エラー時にステータスコード401を受け取るはずが、0になっていました。
Appleの公式ドキュメント読むと、NSURLConnection認証エラー時にはエラーコードでNSURLErrorUserCancelledAuthentication(-1012)を受け取ると記載されています。

私の場合、認証エラー時にはステータスコード401を受け取りたかったのですがNSURLConnectionでは何故か無理なようです。この問題はかなり昔から存在し、ずっと放置されているようです。
対策としてはNSURLConnectionを使用せず、他のものを自前で用意するしかないようです。


拍手[0回]



UIAlertViewにてメモリリーク発生(iOS8)

わか

iOS8にてUIAlertViewが非推奨になりましたが動作自体は問題ないためそのまま使用していました。しかし、instrumentsにて確認を行ったところメモリリークしていました。実行するたびに毎回32byteリークするため、まだ使用している人は他の手段に移行したほうが良さそうです。

拍手[1回]


UIGraphicsBeginImageContextはスレッドセーフ

わか

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

拍手[0回]


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回]