2011年12月18日日曜日

test

選択して下さい
購入してください

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

XCode代替のIDE


ObjectiveCを書くためのIDEはXCode4が独占状態でしたが、AppCodeというObjectiveC用IDEがあるようです。

コード補完機能やリファクタリング機能ががXCodeよりかなり強力になっているようです。
使い方さえなれれば効率がよいエディタのほうがコーディング速度は早くなりそうです。

Appcode
http://www.jetbrains.com/objc/


Key Features
Smart editor with code completion
•Opening and creating Xcode projects (including Xcode 4)
•Integration with the standard Interface Builder
•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
•Hi-class version control systems integration (SubversionGit, Perforce andCVS)

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

メソッドの遅延実行

とあるメソッドを1秒とか0.1秒とか遅れて実行させたいときってありますよね。
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

CMMotionのエラーについて

CMMotion関係のコーディングをして実行したところ

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というプロトコルを使ってオブジェクトに傾きを通知するので、

@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


エラー対処について

■[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