2011年12月18日日曜日
NSOperationについて
NSOperationのサブクラスhogeを定義し,それに- (void) mainを、mainにマルチスレッドで実行したい処理を書き、hogeのインスタンスをインスタンスメソッドaddOperation:でNSOperationQueueのインスタンスに追加し実行する
という流れのようです。
いま読み中のNSOperation関連のブログ
NSOperationによるバックグラウンド処理
http://objective-audio.jp/2008/04/nsoperation.html
NSOperation 非並列実行モードと並列実行モードの使い分け
http://d.hatena.ne.jp/glass-_-onion/20110706/1309909082
という流れのようです。
いま読み中のNSOperation関連のブログ
NSOperationによるバックグラウンド処理
http://objective-audio.jp/2008/04/nsoperation.html
NSOperation 非並列実行モードと並列実行モードの使い分け
http://d.hatena.ne.jp/glass-_-onion/20110706/1309909082
XCode代替のIDE
ObjectiveCを書くためのIDEはXCode4が独占状態でしたが、AppCodeというObjectiveC用IDEがあるようです。
コード補完機能やリファクタリング機能ががXCodeよりかなり強力になっているようです。
使い方さえなれれば効率がよいエディタのほうがコーディング速度は早くなりそうです。
Appcode
http://www.jetbrains.com/objc/
Key Features
•Smart editor with code completion
•Running applications in iOS Simulator
•Debugger with breakpoints, variables, watches and evaluate expression
•Refactorings, e.g. 'Change Signature' and 'Extract Method'
•On the fly code analysis and quick-fix suggestions
imp型とはなんぞや
解説書にimp型というものが書いてあったが、よくわからなかったので色々調べると、Cの関数で下記のように定義されているらしい。
typedef id (*IMP)(id, SEL, ...);
定義から見るに、Objective-C のすべてのメソッドは、id 型と SEL 型の引数をもっているので、結局のところC言語の関数みたいなものにいきつくとかなと思いました。
追記:この記事を見ると、IMP型を使ってCっぽいコードを書くとえらく早くなるようですね
ダイナミックObjective-C
22 メソッドとは何か(5) - メソッドの実装
http://news.mynavi.jp/column/objc/022/index.html
typedef id (*IMP)(id, SEL, ...);
定義から見るに、Objective-C のすべてのメソッドは、id 型と SEL 型の引数をもっているので、結局のところC言語の関数みたいなものにいきつくとかなと思いました。
追記:この記事を見ると、IMP型を使ってCっぽいコードを書くとえらく早くなるようですね
ダイナミックObjective-C
22 メソッドとは何か(5) - メソッドの実装
http://news.mynavi.jp/column/objc/022/index.html
メソッドの遅延実行
とあるメソッドを1秒とか0.1秒とか遅れて実行させたいときってありますよね。
NSTimerなどで遅延させて実行させる方法もあるようですが、performSelectorメソッドを使うと簡単にメソッド実行のタイミングを設定することができます。
このメソッドの活用法としては、エフェクトの実行タイミングや、起動時の要素の読み込みで、重い要素の読み込みを遅延させることで見かけ上の起動時間を短縮させることができるなどいろいろつかえそうです。
NSTimerなどで遅延させて実行させる方法もあるようですが、performSelectorメソッドを使うと簡単にメソッド実行のタイミングを設定することができます。
[self performSelector:@selector(メソッド名:) withObject:nil afterDelay:遅延時間0.1];
このメソッドの活用法としては、エフェクトの実行タイミングや、起動時の要素の読み込みで、重い要素の読み込みを遅延させることで見かけ上の起動時間を短縮させることができるなどいろいろつかえそうです。
2011年12月16日金曜日
initについて
よくある初期化パターン
- (id)init { [super init]; 初期化コードを書く return self; }エラー処理を追加したコンストラクタ
- (id)init { if(self = [super init]){ 初期化コードを書く } return self; }エラーが起きたら中途半端にとったメモリ領域を解放させたほうがトラブルが少ない
- (id)init { if(self = [super init]){ 初期化コードを書く }else{ [super dealloc]; return nil; } } return self; }
2011年12月8日木曜日
Grand Central Dispatchについてかじり中
CoreMotion関係でGCDを使う部分があったのでついでにかじり中
http://www.gamvaro.com/kswiki/index.php?%EF%BC%AF%EF%BC%B3%E9%96%A2%E4%BF%82%2FiPhone%E7%94%A8OS(IOS)%2FGrand%20Central%20Dispatch
http://www.gamvaro.com/kswiki/index.php?%EF%BC%AF%EF%BC%B3%E9%96%A2%E4%BF%82%2FiPhone%E7%94%A8OS(IOS)%2FGrand%20Central%20Dispatch
CMMotionのエラーについて
CMMotion関係のコーディングをして実行したところ
Apple Mach-O Linker Error
Apple Mach-O Linker Error
Undefined symbols for architecture armv7:
"_OBJC_CLASS_$_CMMotionManager", referenced from:
objc-class-ref in MainViewController.o
ld: symbol(s) not found for architecture armv7
clang: error: linker command failed with exit code 1 (use -v to see invocation)
というエラーが出て、ビルドができないことにずいぶんとはまりました。
文法的にも問題ないのに。。とおもっていたら
CoreMotion.frameworkを追加するのを忘れていました(@@)
CoreMotion.frameworkを追加してビルドすると、ちゃんとビルドできるようになります
CoreMotionについて
CoreMortionフレームワークは、デバイスの方向や動きを取得するインターフェースです
UIAccerometerクラスは次のiOSではサポートしなくなるとAppleが宣言していますので、CoreMotionを使うことにします。
加速度センサーとジャイロスコープ(ひねり)センサーからデータを取得します。
高度なフィルタリング機能もあります。
☆位置情報の取得タイミングについて
iOSイベント処理ガイドより
http://developer.apple.com/jp/devcenter/ios/library/documentation/EventHandlingiPhoneOS.pdf
プッシュ型:アプリケーションは、更新間隔を指定し、モーションデータを処理する、(あるタイプの)ブロックを実装します。次いで、Core Motionにオペレーションキューとブロックを渡して、該当するタイプのモーションデータの更新を始めるよう指示します。CoreMotionは(指定された更新間隔で)更新データをブロックに渡してオペレーションキューに入れます。ブロックはオペレーションキューから順次取り出され、タスクとして実行されることになります。
プル型:アプリケーションは、あるタイプのモーションデータの更新を始めるよう指示し、定期的に、直近の測定値をサンプリングします。
☆取得できない情報
GPSデータ
-CoreLocationフレームワークを使いましょう
コンパス情報
-CoreLocationフレームワークを使いましょう
iPhone4以降ではジャイロスコープが搭載されていますのでx軸、y軸、z軸のひねりの速度も取得できます
●クラスについて
CMMotionManager | 情報の取得タイミングなどの設定を行う |
CMAccelerometerData | デバイスのX,Y,Z軸情報を取得 重力情報 |
CMAttitude | roll,pitch,yawなどの姿勢角や行列などの加工されたデーターを取得できます |
CMDeviceMotion | 加速度センサーおよびジャイロスコープから得られた、処理済みのデバイスモーションデータをカプセル化します |
CMGyroData | rotationRateというプロパティ持ち、x,y,z軸における回転の早さ(ラジアン/秒)を持ちます |
CMLogItem | それぞれの位置情報にタイムスタンプを付与する、計測系クラスの親クラス |
2011年12月5日月曜日
加速度について
iPhoneの特徴の1つとして、加速度センサーが内蔵しており、iPhoneの動きを取得してゲームのエッセンスに使ったり、アプリにジェスチャー操作をつけるなど創意工夫で特徴あるアプリケーションを作ることができます。
●ヘッダファイルの書き方
加速度を取得するUIAccerometerクラス取得するは、UIAccerometerDelegateというプロトコルを使ってオブジェクトに傾きを通知するので、
と指定します。
次にUIAccerometerインスタンス化と初期設定をコーディングしていきます(この場合は最初に読み込まれるviewDidLoadメソッドに書きこんでいます。
●ヘッダファイルの書き方
加速度を取得するUIAccerometerクラス取得するは、UIAccerometerDelegateというプロトコルを使ってオブジェクトに傾きを通知するので、
@interface MainViewController : UIViewController{
IBOutlet UILabel *x; IBOutlet UILabel *y; IBOutlet UILabel *z; }
と指定します。
次にUIAccerometerインスタンス化と初期設定をコーディングしていきます(この場合は最初に読み込まれるviewDidLoadメソッドに書きこんでいます。
- (void)viewDidLoad { [super viewDidLoad]; // UIAccerometerに対してsharedAccelerometerクラスメソッドを送り、インスタンスを作成
//setUpdateIntervalで取得間隔を設定します。この場合は0.1秒間隔で取得する設定
[[UIAccelerometer sharedAccelerometer] setUpdateInterval:0.1];
// デリゲート通知を自身に指定します
[[UIAccelerometer sharedAccelerometer] setDelegate:self];
}
//デリゲートメソッド - (void) accelerometer:didAccelerate:を実装 - (void)accelerometer:(UIAccelerometer *)accelerometer didAccelerate:(UIAcceleration *)acceleration{ x.text = [NSString stringWithFormat:@"%10.2f",acceleration.x]; y.text = [NSString stringWithFormat:@"%10.2f",acceleration.y]; z.text = [NSString stringWithFormat:@"%10.2f",acceleration.z]; }
2011年12月2日金曜日
iPhoneアプリ申請時に起きたエラーなどについて
とあるiPhoneアプリをiTunesConnectに提出することがありまして、前と仕様が変わっていたりエラーではまったのでメモ。
良くありがちな設定ミスの確認
●証明書の再発行
-再発行の時にメールアドレスや名前をAppleに登録したものと同じものにする
●プロビジョニングファイルの再発行
●Identifierの設定を確認する
XCodeの左ペインのあおいプロジェクトファイルのアイコンを選択して
TARGETS→アプリ名→Summary→Identifierの欄がcom.yourcompany.アプリ名ではなく
設定したAppIDを選択しているか確認
●Schemeの設定
Stopボタンの横のSchemeをクリックし、Edit Schemeを選択。左のArchiveを選択し、BuildConfigulrationをDistributionに設定しているか確認
もしDistributionがなかったら、XCodeの左ペインの青いプロジェクトファイルのアイコンを選択して、
Project→Info→Configurationsの左下の+マークを選択し、"Duplicate Release Configuration"を選ぶとrelease copyができるので、"Distributionに変更して、Schemeの設定をする。
●CodeSigningの確認
XCodeの左ペインのあおいプロジェクトファイルのアイコンを選択して
TARGETS→Build Settings→Code Signing Identityをチェックして、Distributionの項目がiPhone Distributionの適切なアプリ名を選択しているか確認。
どうしてもダメな場合、OSの再起動やXCode再起動や再インストールで治ることもあったりします笑
参考にしたブログ
登録の方法のおさらい
Xcode4でiPhoneアプリをiTunes Connectに登録する方法
http://blog.livedoor.jp/tattyamm/archives/2957285.html
App StoreへのiPhoneアプリの登録手順のまとめ(Xcode4環境)
http://www.facebook.com/note.php?note_id=153450554720309
http://blog.livedoor.jp/tattyamm/archives/2957285.html
App StoreへのiPhoneアプリの登録手順のまとめ(Xcode4環境)
http://www.facebook.com/note.php?note_id=153450554720309
エラー対処について
■[iPhoneプログラミング]新しい開発環境を構築したときにprofile関連でエラーとなるときの対処法
http://d.hatena.ne.jp/nakamura001/20100214/1266172164
XcodeでArchiveエラーのときの対処 その1
http://iphone-app-developer.seesaa.net/article/230412566.html
ハマッた。Application failed codesign verification. The signature was invalid, or it was not signed with an iPhone Distribution Certificate. (-19011)
http://www.hirano-dept.com/blog/2011/11/application-failed-codesign-verification-the-signature-was-invalid-or-it-was-not-signed-with-an-ipho.html