2011年1月7日金曜日

キーボードをしまう

キーボードをしまうには、現在ファーストレスポンダになっているテキストベースビューのresignFirstResponderメソッドを呼び出します。
Text Viewがファーストレスポンダの状態でなくなると、現在の編集セッションは終了し、そのことがデリゲートに通知されます。
そして、キーボードが消えます。つまり、myTextFieldという変数が、現在ファーストレスポンダになっているUITextFieldオブジェクトを指す場合、キーボードをしまうには以下のコードを実行するだけです。
[myTextField resignFirstResponder];
---------------------------------
以下のような状態の場合、












「LogIn」ボタンを押下した時、キーボードが隠れるようにするためにはログインアクション実行後、テキストフィールド(この場合は、ID と PASSWARD を入力するフィールド)のresignFirstResponderメソッドを呼び出す。

参照:
iPhone アプリケーションプログラミングガイド テキストとWeb->キーボードの管理->キーボードをしまう

2010年12月23日木曜日

three20 をプロジェクトに追加する

1.
プロジェクトフォルダ内に three20 フォルダを置く

2.
スクリプト実行

python ./src/scripts/ttmodule.py -p (プロジェクトフォルダへのパス)/(プロジェクト名).xcodeproj -c Debug -c Release Three20

python ./src/scripts/ttmodule.py -p (プロジェクトフォルダへのパス)/(プロジェクト名).xcodeproj Three20 // " -c Debug -c Release " オプションを付けると、他のライブラリを追加したときにリンクエラーが出るので使用をやめた

3.
ヘッダ検索パスに追加
(three20 フォルダへのパス)/three20/Build/Products/three20

4.
他のリンカフラグに、 -all_load を追加する(私の場合、すでに -ObjC -lxml2 が追加されているのでこれで3つ追加されていることになる)。
---------------------
git のthree20 のページを参照する。
色々説明がかいてあるので。

three20 gitページ
↑ページにヘルプを見ろと書いてる
python ./src/scripts/ttmodule.py -h

ヘルプに以下のような記述
Add the Three20 project settings to the Debug and Release configurations.
  This includes adding the header search path and linker flags.
  > ttmodule.py -p path/to/myApp.xcodeproj -c Debug -c Release
→ヘッダ検索パスとリンカフラグを追加すると書いてある

2010年12月2日木曜日

GDA のクラス関係

Google Data APIs Objective-c Client Library (GDA) の、picasa 関連のクラス関係図をxcode で一部可視化してみる。






GDataFeedPhotoBase と GDataEntryPhotoBase のスーパークラスは共に、GDataObject クラスである。

--------
xcode でクラス図を作成する。
設計 -> クラスモデル -> クイックモデル

2010年12月1日水曜日

UIImage でURL の画像を表示する。

  NSString *path = @"http://*******/************/**.jpg"; // URL
NSURL* url = [NSURL URLWithString:path];
NSData* data = [NSData dataWithContentsOfURL:url];
photo = [[UIImageView alloc] initWithImage:[[UIImage alloc] initWithData:data]];
[self.view photo];

2010年11月15日月曜日

プロパティに関するコーディングルール

Google Objective-c スタイルガイド 日本語訳 の、プロパティについて以下を参考にする。

文字列には copy を使うこと
NSStringプロパティには、必ず copy 属性を宣言するべきです。

これは論理的には、NSString のセッタには必ず、retain の代わりに copy を使わなければならない、というルールに従ったものです。

アトミック性
プロパティにはオーバーヘッドがあることを認識しておいてください。デフォルトでは、同期のセッタとゲッタはすべてアトミックになります。そのため、セットとゲットの呼び出しには同期オーバーヘッドがかなりあります。アトミック性が必要ないなら、プロパティを nonatomic と宣言しておいてください。

Delegate パターンについても以下を参考にする。
Delegate パターン
Delegate オブジェクトを retain するべきではない。

<-- 追記 -->
命名規則
プロパティに対応するインスタンス変数名は、アンダースコア(_)で終わらなければなりません。プロパティ名は、対応するインスタンス変数名から最後のアンダースコア(_)を取り除いたものにするべきです。

@interface MyClass : NSObject {
@private
NSString *name_;
}
@property(copy, nonatomic) NSString *name;
@end

@implementation MyClass
@synthesize name = name_; // インスタンス名を隠蔽できる。
@end
// ------------------------------------
NSLog("%@", self.name);

-(void) dealloc{
self.name = nil;
[super dealloc];
}

参考
Google Objective-c スタイルガイド 日本語訳

2010年11月13日土曜日

プロパティ

目的*1
■ プロパティ宣言により、アクセサメソッドの動作方法の明瞭で明示的な仕様を指定できます。
■ コンパイラは、宣言で指定された仕様に従ってアクセサメソッドを合成できます。これは、コードの記述と保守が少量で済むことを意味します。
■ プロパティは構文上は識別子として表現され、範囲付きであるため、コンパイラは宣言されていないプロパティの使用を検出できます。
■ あるクラスによって宣言されたプロパティの実行時のイントロスペクション。
-----------------------------------

イントロスペクション(リフレクション)*2
通常、プログラムのソースコードがコンパイルされると、プログラムの構造などの情報は低レベルコード(アセンブリ言語など)に変換される過程で失われてしまう。リフレクションをサポートする場合、そのような情報は生成されるコードの中にメタデータとして保存される。

宣言属性
iPhone 開発で主に使用される属性をまとめた。
プロパティ属性 説明
assign setterで単純代入を使用することを指定する
retain 代入時にオブジェクトに対してretain を呼び出す必要があることを指定する
copy 代入にオブジェクトのコピーを使用することを指定する
nonatomic 合成されるアクセサが非アトミックになるように指定する

retain*3
クライアントオブジェクト側において、プログラム上の有効範囲を超えた後も受け取ったオブジェクトを保持する必要がある場合は、受け取ったオブジェクトを保持できます。それには、retainメッセージを送信します。

nonatomic*4
nonatomic属性の影響は環境によって異なります。デフォルトでは、合成されるアクセサはすべてアトミックです。マネージドメモリ環境では、アトミックな動作を保証するにはロックを使用する必要があります。また、返されるオブジェクトは保持され自動解放されます。このようなアクセサが頻繁に呼び出されると、アトミックな動作はパフォーマンスに重大な影響をもたらすことがあります。ガベージコレクトされる環境では、ほとんどの合成メソッドはこうしたオーバーヘッドなし
でアトミックになります。
アトミックな実装の目的は堅牢なアクセサを提供することであり、コードの正確性を保証することではないことを理解することが重要です。「アトミック」とは、プロパティへのアクセスがスレッドセーフであるという意味ですが、単にクラス内のすべてのプロパティをアトミックにするだけでそのクラス(一般にはオブジェクトグラフ)が「スレッドセーフ」になるということではありません。スレッドの安全性を個々のアクセサメソッドのレベルで表現することはできません。

参照

*1
Objective-C 2.0 プログラミング言語

*2
イントロスペクション(リフレクション)

*3
Cocoa Fundamentals Guide / cocoaオブジェクトのライフサイクル

*4
objective-c 2.0 プログラミング言語 / パフォーマンスとスレッド

2010年11月12日金曜日

参照カウンタ

objective-c のメモリ管理方法。
基本原則
「alloc」または「new」で始まる名前のメソッドや、「copy」を含む名前のメソッド(たとえば、alloc、newObject、mutableCopy)を使用してオブジェクトを作成した場合、またはオブジェクトにretainメッセージを送信した場合は、そのオブジェクトの所有権を取得できます。
その場合は、releaseまたはautoreleaseを使用してオブジェクトの所有権を放棄する責任が
あります。それ以外の方法でオブジェクトを受け取った場合は、そのオブジェクトを解放してはなりません。

メッセージ 保持カウント
alloc 1にする
copy 1にする
new 1にする
retain 1つ増える
release 1つ減る
autorelease 1つ減る(ただし、任意のタイミング)


参考
Cocoaメモリ管理プログラミングガイド