Xcodeで実機デバッグを行う際に、
No architectures to compile for (ONLY_ACTIVE_ARCH=YES, active arch=armv7s, VALID_ARCHS=armv7).
↑このようなエラーが出てビルドが失敗するケースがあります。
何も考えずに@synchronized
を使っていると次第に心が蝕まれていくので、
時にはスピンロックを使いたくなる事があると思います。
幸いな事に自作しなくてもiOSがAPIを提供してくれているので、それを使いましょう。
基本的な使い方を以下のサンプルコードで示します。 ヘッダ名が如何にもリジェクトされそうな雰囲気を醸し出していますが、大丈夫だそうです。
CorePlotを使う上でのTipsをまとめていきます。随時更新。
###データを更新する
- (void) reloadGraphData:(CPTGraph*)graph
{
// データ取得の各種delegateが実行される。
// graphに加えた表示上の変更はこれを実行しなくても即座に反映される。
例えばインストールされているアプリをリストアップする機能を作りたいとします。
インストールされているアプリのアイコンそのものを取得するにはmobile.installation.plistからディレクトリを掘って直接ファイルを拾ってくれば良いのですが、サンドボックス環境を破る必要があるので若干面倒です。
もし仮に知りたいアプリのBundle IDが判明していれば、そこでiTunes Search APIを使うとBundle IDから一意にアプリを検索出来るので、これを使ってAppStoreに公開されているアイコンを取得する事が出来ます。
@interface BundleHelper : NSObject
コードブロックの実行時間をなるべく非侵入的に計測したい場合に、for制御構文を流用するやり方です。 for文の初期化節で開始時刻を記録し、一回だけループを回して終了条件節でダンプを行います。 C++のスタックにオブジェクトを作ってデストラクタを走らせるパターンがよくありますが、Cでも同じような事は出来ます。 色々応用出来ると思います。
static inline bool ____benchmark_check_time(char const * const comment, uint64_t const start, uint64_t const tick)
{
if (!tick) return true;
OpenGLにコンパイルしてもらう時点でシェーダにはある程度最適化が行われるようですが、 モバイルデバイスではあまりコストの掛かる最適化は行われないだろうという事で、 オフラインでGLSLの最適化をしてくれるフレームワークとしてglsl-optimizerがあります。 サポートされているGLSLバージョンはES2.0とES3.0もカバーしていますが、未対応の拡張もあります。
元々はUnityが機械生成した冗長なGLSLを最適化するために作られたようですが、 一応手書きのシェーダの最適化に使うこともできます。 ただし、組み込みを前提としているようでコマンドラインからキックするバイナリは提供されていません。
アプリを実機のランニングテストで回していて運良くクラッシュを引き当てた時に、
Last Exception Backtrace:
0 CoreFoundation 0x321d629e __exceptionPreprocess + 158
1 libobjc.A.dylib 0x39e3297a objc_exception_throw + 26
2 CoreFoundation 0x321208d4 -[__NSArrayM insertObject:atIndex:] + 764
3 YourApp 0x0002fbf0 0x20000 + 64496
4 YourApp 0x0015e2c8 0x20000 + 1303240
型安全な汎用文字列生成マクロをquasi quoteで実装してみます。 機能として次のような物を持たせます。
{-# LANGUAGE TemplateHaskell, DeriveDataTypeable #-}