SwiftではSwitch構文で文字列が使えるようだが Objective-CにはObjective-Cの良さがあると思う。C由来のゴタゴタやしがらみ、ややこしさ、汚さをフル活用すれば出来ないことはない・・・と思う。 StackOver風呂でいい記事を見つけた http://goo.gl/LBeX77 に書いてあるんだが #define CASE(str) if ([__s__ isEqualToString:(str)]) #define SWITCH(s) for (NSString *__s__ = (s); ; ) #define DEFAULT SWITCH (string) { CASE (@"AAA") { break; } CASE (@"BBB") { break; } CASE (@"CCC") { break; } DEFAULT { break; } } とすればい
この記事にリンクして、詳細に書いてくれている記事があったので紹介。 クラス拡張とカテゴリの違いの話。 Objective-Cの内部実装にも触れて分かりやすく書いてくれているので、より どういう違いがあるかが分かるかと思います。 AppleのiOS View Controllerプログラミングガイドを読んでいて気づいた。 なんで実装ファイルの方で@interfaceを宣言しているんだろうと思っていたのだけど、これはどうやら クラス拡張 というものらしい。 似たような仕組みに、 カテゴリ がある。 カテゴリは@interface Hoge(anyCategory)で宣言するやつ。 これを無名にしている(つまり@interface Hoge())のが、実装ファイルでよく書かれているやつだ。 なるほど、無名カテゴリだから()なのか。 と腑に落ちたことをTwitterでつぶやいたら、「いや
今年の2月ごろから iOS 用の HTTP 通信ライブラリの開発をしていています。 シンプルで簡単に HTTP 通信が出来るライブラリを公開しました 非同期で HTTP 通信をするだけの簡単なライブラリなんですが、ユニットテスト(Unit Test)をする時に少しコツが必要だったのでその紹介です。ここで紹介する方法は非同期(Async)処理のテスト全般で使える技だと思います。 iOS でユニットテストを実施するときは iOS に標準で付属している SenTestingKit というフレームワークを使います。 ユニットテストの書き方 SenTestingKit の使い方は Java の JUnit とほとんど同じで簡単です。SenTestingKit では SenTestCase というユニットテストのための基底クラスが提供されています。まず SenTestCase クラスを継承したテスト用
前提「iPhoneアプリを作りたいなら」ではない。「売れるアプリを作る企画力」や「イケてるUIを作るデザイン力」なしに、「アプリ開発に必要なObjective-Cの技術力」だけあっても意味ない。それでもいい人向け。前提2巷のブクマされている「オススメ本集」は自身の著書や身内の本を薦めるためのポジショントーク的な選書がよくある。溢れかえる「分かりやすさ」を訴える本は必要はない。買うとしても1冊で十分。 分かりやすい本じゃないと身につかないなら、結局作れるものは「その程度」のものに留まる。そして「その程度」を作れる人は既にうじゃうじゃいるからApple税を無駄にするだけ。公式ドキュメント日本語ドキュメント - Apple Developer 日本語化された公式ドキュメント。全てを読むのは難しいが、「Objective-C プログラミング言語」「Objective-Cによるプログラミング」を読め
block blockはコード中のブロックのこと. caretと呼ばれる”^”から始まる. 関数外のローカル変数を使えるがread only. が,ローカル変数を __blockをつけて宣言していれば,書き換えることも可能. e.g. __block BOOL something = NO; こうするとブロック内でYESに書き換えられる. typedefすると便利. double型の引数を1つとり,返り値がdoubleであるブロックオブジェクトの型に unary_opeartion_tをつけるには次のようにする. typedef double (^unary_opeartion_t)(double op); そうすると, unary_operation_t square; square = ^(double operand) { return operand * opera
Objective-Cライブラリのドキュメント作成は今までDoxygenを使っていたのですが、もうすこしObjective-C用に適したドキュメント作成ツールがないか調べていたらappledocを見つけました。 その名の通り、Appleの公式リファレンス風のドキュメント生成をしてくれるソフトで、基本的にはdoxygenと似たような使い方をします。試しに使ってみたら結構よい感じでした。 Doxygenとの比較 Apple公式リファレンスに近いフォーマットで出力できるので、ユーザは多分読みやすい。 特にTasksでメソッドを機能ごとに分類できる。 インストールが面倒だったり、GUIアプリがなかったり、慣れていない人(特に技術者以外の人)には使いにくいかも。 まだ若干挙動があやしい部分もある気がする。 もはやドキュメント作成ツールの定番であるDoxygenに比べると、まだ歴史も情報もユーザも少な
UIAppearanceプロトコル iOS5 から UIAppearance プロトコルが導入された。このプロトコルを使うと UINavigationBar や UISwitch のインスタンスの色を変更することができる。変更の仕方はこんな感じ。 [[UISwitch appearance] setOnTintColor:[UIColor greenColor]];UIAppearance が有用なのは、上記の通りインスタンスではなくクラスに対して色設定ができること。つまりこれを使うと画面上で使われているすべての UISwitch の色を変えることができる。 例えば緑基調の画面があったとして、UIAppearance プロトコルを使うと別の色(例では赤)に変更することができる。 上記の例は1画面だけだが、アプリで使われるすべての画面で色が変わる。 上記例の色変更の箇所のコードはこんな感じ。
appledocはObjective-CのコードからHTMLリファレンスを生成するソフトウェア。 appledocはObjective-C製のオープンソース・ソフトウェア。外部のライブラリやフレームワークを使って開発していると、そのコードの中身を見て動作を確認する方が早くなる。そんな時に使えるのがAPIのリファレンスだ。リファレンスを使うとあたりをつけるのが早くなる。 生成されたドキュメント そのためシステム開発においてはソースコードからリファレンスを生成する系統のライブラリに人気が集まる。Objective-Cであればappledocを使ってみよう。 appledocはAppleのリファレンス風のHTMLファイルを生成するツールだ。JavaDocのようにコードに元々記述しなければならないが、その結果はとても素晴らしい。左側にツリーが、右側にコードリファレンスが表示される。必要に応じてクリ
今回からは、新しいアプリとしてロギングアプリを取り上げよう。「ロギング」とは記録を残すという意味で、いろんなロギングが考えられるが、ここでは位置情報のログを取る事にする。iPhoneを持ってあちらこちらに移動して、いく先々でちょっとしたつぶやきを残す、というアプリを作ってみよう。 iPhoneでの位置情報の取得 iPhone OSでは、現在地情報を取得する事ができる。これは、モバイル機器では非常に魅力的な機能になる。位置情報を取得するための技術は、以下の3つの複合となっている。 GPS 3Gネットワーク Wi-Fi デバイスによって利用できる技術に差が出てくる。iPhoneではすべての技術が利用できるし、iPod touchではWi-Fiしか利用する事ができない。従って、屋外で十分な精度で位置情報を取得するには、iPhoneが必須と言えるだろう。 iPhoneで位置情報を取得するアプリを作
NetConnection.h #import <Foundation/Foundation.h> @interface NetConnection : NSObject { NSURLConnection *connection; NSMutableData *data; id object; SEL selector; } - (void)initWithURL:(NSString *)url object:(id)object_ selector:(SEL)selector_; @end NetConnection.m #import "NetConnection.h" #import<objc/runtime.h> @implementation NetConnection - (void)abort { if (connection != nil) { [connection c
ImageStoreはiOSで画像を非同期ダウンロードするためのObjective-Cライブラリです。Satoshi Nakagawaさんがオープンソースのライブラリとして公開されています(New BSDライセンス)。手軽に使えて非常に便利なライブラリなのですが、そのままアプリに組み込むには少々難があります。 ダウンロードをキャンセルする手段がない ImageStoreのインスタンスを破棄する以外に、キャッシュをクリアする方法がない 正常に画像がダウンロードできたかどうか判定する術がない 1がないので、ダウンロード中に画面移動が発生したりすると容易にクラッシュします。2がないので、随時キャッシュを消して再ダウンロードしたり、メモリ不足時にキャッシュを削除したりといったことができません。3のため、サーバが404を返した場合等にはリクエストが無限ループしてしまう危険があります(ImageSto
開発部の三森です。前回の続きです。 メモリ使用量を見るためにObjective-Cのランタイムapiを使ってみることを考えます。 Objective-Cで書かれたプログラムは、コンパイルされたプログラムだけでなく、ランタイムが必要になります。 このランタイムがオブジェクトの生成、メソッドの使用などをプログラムの実行時に動的に割り当てるようになっています。 そしてランタイムapiを使えば、オブジェクトのもつメソッドを自由に入れ替えたり書き換えたりできるのです。 どんなapiがあるかはAppleのドキュメントに詳しく書いてあります。 ランタイムapiを使うには、まず #import <objc/runtime.h> でヘッダを読み込みます。 オブジェクトのメモリ確保はNSObjectの持つ"+alloc"セレクターで行われるので、 これを新しいものに上書きしてデバッグ情報を得ることを目標にしま
インスタンス変数にアクセスする方法として、GetterとSetterを自前でコードを記述し、インスタンス変数へのアクセサを提供する方法があります。これはJava/C++等のオブジェクト指向言語で一般的に利用される方法だと思います。 ですが、インスタンス変数が多くなるにつれて、同じようなメソッドをいくつも記述する必要があり現実的ではない場合もあります。あまりにも数が多い場合にはGetter/Setterコードを出力するツールを作成したりもした経験があります。 Objective-Cではこの面倒な作業を簡略化してくれます。全てが自動的に行われるわけではありませんが、固定的なコードの生成作業は大幅に少なくなります。
リリース、障害情報などのサービスのお知らせ
最新の人気エントリーの配信
処理を実行中です
j次のブックマーク
k前のブックマーク
lあとで読む
eコメント一覧を開く
oページを開く