Pebble Coding

ソフトウェアエンジニアによるIT技術、数学の備忘録

Objective-C

C++/ObjC/swift コーディング規約

私が考えるC++/ObjC/swift についてのコーディング規約です。 基本的にコーディング規約はプロジェクトの生産性を最大化するのが目的であり、厳しすぎず、ゆる過ぎないものにするべきです。 以下、箇条書きにしていきます。 守るべき規約 定数は先頭に k の…

Xcode6.4でボトルネックとなっている遅い処理を特定する(iOS/OSX)

Xcodeに付属するInstrumentsで遅い処理を特定する手順です。 Instrumentsの中のTimeProfilerを使います。 Profileを実行します。 TimeProfilerを選択します。 赤いボタンを押すと実行が始まります。 スレッド毎にかかった時間(milliseconds)と比率(%)が表示…

swiftのクラスをobjective-Cで継承することはできない

stackoverflow.com あるクラスをobjcからswiftへ移行するなら、継承関係にあるクラスはすべて、いちどきにswiftに書き換えないといけない。

ObjCのNS_ENUMのswiftからの見え方(swift2)

Objective-CでNS_ENUM定義がswiftでどのように見えるか実験した。 enum.h typedef NS_ENUM(NSUInteger, Element){ ElementFire, ElementWater, }; typedef NS_ENUM(NSUInteger, FRUIT){ FRUIT_APPLE_1, FRUIT_ORANGE_2, }; typedef NS_ENUM(NSUInteger, ANIM…

ObjCからswiftソース上で呼び出せるのはクラスまたはプロトコルのみ

勘違いしていたが、ObjC側からswiftソース上で呼び出せるのは、クラス(のメソッド)、プロトコル、整数型のenumのみだった。 swift上で書いたグローバル関数やグローバル変数は呼び出せないのだった。逆は可能。 つまり、ObjCのクラスはswiftへ移行できるが整…

OSXのAudioUnit自作ガイド

OSXのAudioUnitを自作する場合は、Appleの以下のサンプルソースを参考に作るのが、もっとも早道です。 TremoroUnitというトレモロ効果を与えるサンプルです。 Core Audio Utility Classes ビルドしてできたTremoro.componentをどこにインストールすればいい…

swiftで使えるAtomic系API (OSX/iOS)

swiftで使えるAtomic系APIがあったので備忘録としてリストアップしておく。 OSX/iOSで確認した。 func OSAtomicAdd32(__theAmount: Int32, __theValue: UnsafeMutablePointer<Int32>) -> Int32 func OSAtomicAdd32Barrier(__theAmount: Int32, __theValue: UnsafeMu</int32>…

pthread_mutex_t と NSLockはどのくらい速度に違いがあるのか

2つのスレッドでウェイトを入れながら、一つの変数に排他アクセスをそれぞれ5000回行ったときの時間です。 MacOSX 10.10.4 MacBook Air (13-inch, Early 2015) @synchronized 0.092384 sec objc_sync_enter 0.090988 sec pthread_mutex_t 0.091280 sec NSLoc…

The executable was signed with invalid entitlements.

Distribution用にいろいろ作業していたら、なぜかテスト用デバイスに上記のエラーで転送できなくなった。 Provisioning ProfileがDebug,Release共通になっていたので、Releaseの方はDistribute用、Debugの方をXcodeによって自動生成されたものに置き換えたら…

no matching provisioning profiles found for appex com.security.application-groups

no matching provisioning profiles found for appex com.security.application-groups iOSアプリのvalidationで上のようなエラーが出て1時間ほどハマっていたので、メモ。 解決方法は、Apple DeveloperのProvisioning ProfileのDistributionの対応アプリの…

NSString型のプロパティ

Objective-CでNSString型のプロパティににはstrong属性ではなく、copy属性を使った方がよいという記事をみかけますが、 私はデフォルトのstrongのまま使います。 copy属性を使った方がよい理由として、NSMutableStringの値を設定したときに、copy属性の方が…

Xcode C++ link error

"std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> >::at(unsigned long) const", referenced from: 上記のリンクエラーがでるときは、以下のライブラリを追加すればよい。 libc++.dylib</char></char,>

Apple InAppItemのアップロード

現在InAppItemのファイルをXcode5.1.1でアップロードすることはできず、 ApplicationLoaderでアップロードするしかないようです。 OrganizerでのValidateすらできません。 手順 1) Xcode-Product-archiveする。 2) Orignizerでリストを選択しExportボタンを…

armv7s関連のリンクエラー

Xcode6から $(ARCHS_STANDARD)や $(ARCHS_STANDARD_32_BIT)や $(ARCHS_STANDARD_INCLUDING_64_BIT)には armv7sを含まなくなったようです。このせいでリンクエラーが出る場合があります。 対処方法としては、 armv7s対応をやめる のが素直ですが、armv7s対応…

静的fatライブラリに含まれるarchitectureの種類を確認するコマンド

$lipo -info lorem.a Architectures in the fat file: lorem.a are: i386 x86_64 armv7 arm64

「ld: framework not found Metal for architecture」 の対処方法

Xcode5(iOS-SDK7)とXcode6(iOS-SDK8)を両方入れた環境で、 Xcode5でプロジェクトビルドすると ld: framework not found Metal for architecture のリンクエラーが出ることがありますが、その対処方法です。 プロジェクトのLink Frameworks AutomaticallyをNO…

Xcodeでよく使うパス

Xcodeでよく使うパスのメモ 1) iOSでバイス、デバッグビルドで使われるパス。 古いバージョンの.aファイルなどが残っていると、間違ったものがリンクされるので、手動で消すときに使う。 ~/Library/Developer/Xcode/DerivedData 2) Xcode Pluginがインストー…

iOS/MacOSXのvDSP関数、多すぎてなかなか見つけられないのをなんとかする(基礎編)

iOS/MacOSXのvDSP関数というのは、サンプル数が多くなるほど、for文をまわすより確実に処理速度があがります。 驚くことにSIMD組み込み関数を使うよりも速く、アセンブラ命令によってかなりの最適化が入っているようです。 俺のアプリは信号処理なんてやって…

Xcodeのコンソールログファイルの置き場所

~/Library/Logs/iOS\ Simulator/*/system.log

Xcode5.1.1(2014-04-19時点最新)でメモリリークを調査する際のTIPSその2

InstrumentsのLeaksでメモリリークを調査する際のTIPSその2です。 Leaksで素早くメモリリークを調べて直すのにはコツが必要です。 SXXP細胞のアレと同じですね。 コツが分かっていないと無駄に時間を使ってしまいます。 そこでTIPSとしてまとめておきます。…

iOSでHTTPS通信の内容をキャプチャする方法のメモ

iOSでHTTPS通信の内容をキャプチャする方法のメモです。 実デバイスでもiOSSimulator(MacOSX)でもできますが、ここでは、 iOS実デバイスがHTTPS通信をキャプチャされる側、MacOSX 10.8をプロキシとして使用します。 以下の記事を参考にさせて頂きました。 ht…

sendSynchronousRequestをBasic認証で使う

NSURLConnectionにはsendSynchronousRequestというクラスメソッドがありますが、 Basic認証は動かない。 ということで自作してみました。 https://github.com/pebble8888/PBURLConnection @interface PBURLConnection : NSObject + (NSData *)sendSynchronou…

Xcodeでヒープ領域アクセスオーバーランを短時間で見つける

Xcodeにはデフォルトでヒープ領域(mallocやnew)のアクセスオーバーランを 検知してくれる機能があります。 ただ、一発で検知してくれません。確実に検知する方法をここでは紹介します。 例えば、以下のようなヒープ領域をオーバーランするサンプルを使います…

Xcode with XVim と MacVim を平行して使う

私は、Xcode with XVim と MacVim を平行して使っているのですが、これをやるためには、Xcodeで開いているソースファイルをカーソル位置を保存した状態でMacVimで開けないと正直やってられません。 この機能が動くようにする手順を書いておきます。 手順1) J…

Objective-Cでのメモリ管理tips

初心者向けにObjective-Cでのメモリ管理関連で私が持っている知識をまとめておく。 1) なるべくARC(Automatic Reference Counting)を使う。 2) IBOutlet にはARCの場合はweak、Non-ARCの場合はstrongを使う。 3) Non-ARCの場合、なるべくretain,releaseを書…

NSCopyingプロトコルに準拠する場合の実装メモ

NSCopyingプロトコルを実装する時に、いつも書き方を忘れているのでメモしておく。 @interface Bean : NSObject @property (nonatomic,strong) NSString* country; @end @interface Coffee : NSObject @property (nonatomic,assign) NSUInteger coffeeid; @p…

Objective-Cでruby風のシンタックスシュガーを使う

githubを眺めていたら面白そうなプロダクトを見つけたので紹介します。 NSArrayやNSDictionaryにカテゴリを使って、ruby風のシンタックスシュガーを使えるようにしています。 Objective-C と RubyMotion の中間のような感じです。 https://github.com/mneorr…

Objective-Cでフレームワークやスタティクライブラリを作る際の注意

Objective-Cのカテゴリ機能が含まれるstatic library を作ると、それを使う側は リンカフラグに "-ObjC" 、"all_load" を設定しないといけません。 Appleによる解説 私は面倒なのが嫌いなので、static libraryを作る際にはカテゴリを使わないようにしていま…

Objective-Cの新文法対応OSバージョン

Objective-Cには次々と新しい文法が追加されていますが、 レガシーなOSバージョンでどこまで対応しているのかいまいち分かりづらいです。 Appleの資料に一覧を見つけましたが分かりやすくするため、勝手に日本語化してみました。怒られたら削除します。 OSX…

Xcodeのデフォルトファイルテンプレートを変更する

Xcodeで新規Objective-Cクラスや新規C++ファイルクラスを生成するときに Copyright表示や、インクルードガードがデフォルトで設定されますが、 ファイルをたくさん作っていると、デフォルトの内容を毎回同じように修正していて 効率が悪いので、どうにかでき…