iPhoneの開発を始めました。 -16ページ目

NSThread・・・。

このクラスでスレッドが簡単に使えてとても便利な物です。


detachNewThreadSelector: toTarget: withObject:
というクラスメソッドでも使えるし、


allocしてセレクターを指定してでも使えます。


自分はクラスメソッドだと、自分が読んでから今スレッドが回っているのか把握しにくいと思って
生成して使っています。

でも、これもまた難しいんですよね~


今タブの処理を画面を先に見せといて、データをロードする思い処理をスレッドでまわしてロードが終わったら自然にデータが表示されるような物を作ってたんですけど・・・。

それが馬鹿みたいにタブをあれこれ連打してしまうと、スレッドを何十個もまわす事になって・・・。

結局は落ちるんですよね。。




何かのボタンを押した時、でもその時の処理が重い時・・・。

どうすれば、今みたいに落ちないとしても明らかにiPhoneの画面が止まっているというような症状が起きるのを防ぐ事が出来るのか・・・。

それがわからないのです。

ま、普通に使うには問題がないんですけどね・・・。

でも、こうやって馬鹿みたいな事をされても普通に動けるようにしたいんですけど・・。
むずい~~~~~!

Cocoa的な柔軟なメソッドの呼び出し

今回はかなり基本概念です。

最近ずっと仕事に追われていて、ちゃんと勉強出来てないんじゃないかと思いまして。。




という事で、今回はIDがたについて



iphoneには id 型というのがある。

Cでの void がた。



んで、よくやるのが

- (IBAction) buttonAction: (id)sender;

こんなのがよくある。

IBAction は Interface Builderからのアクションをつなげる為のメソッドになるんですよね。
こんな説明でいいのかわかりませんが、メソッドを呼び出すタイミングを
Interface Builderで制御したい時に、戻り値を (IBAction)とします。
たぶん Interface Builder Action っていうことじゃないかと・・・。

そして、後ろにある引数の (id)sender。

今回はこれについて書いてみようと思います。

(id)がたのsender

このメソッドを呼び出した物が何かはわかりませんが、そいつのアドレスがsenderなのです。

つまり、クラスのポインター変数。かな?


自分はよくこんな風につかってます。

- (IBAction) do: (id)sender
{
UIButton* btn = sender;

[btn setTitle: @"aaa" forState: UIControlStateNormal];
}


このメソッドはUIButtonからしか呼ばれないように設計をし、
ボタンから呼ばれたらそのボタンのタイトルをaaaに変えてしまう恐ろしいメソッドです。。。笑

こういう風にする理由(UIButton* btn にわざわざ代入してメソッドを呼び出す) はエラーの起りにくい柔軟なプログラムを組むのはやっぱり難しいので、
このメソッドはボタンから呼ばれた時にだけ使うようにと使用する物が認識して使う為です。


が、これが本当はCocoa的なプログラミングの考え方ではないみたいです。

- (IBAction) do: (id)sender
{
if (sender respondsToSelector: @elector(setTitle: forState:))
{
[sender performSelector: @selector(setTitle: forState:)
withObject: @"これがCocoa的なプログラム"
withObject: UIControlStateNormal];
}
}

respondsToSelectorというメソッドで、そのオブジェクトがメソッドを所有しているのかを確認し、
performSelectorというメソッドで呼び出す。

ま、こんな簡単な例ではたいした違いもないし、実際自分もあまりわかってないのかも知れないけど、
cocoaだけの柔軟なメソッドの呼び出しという事で覚えよう!

Cocoa的な柔軟なメソッドの呼び出し

今回はかなり基本概念です。

最近ずっと仕事に追われていて、ちゃんと勉強出来てないんじゃないかと思いまして。。




という事で、今回はIDがたについて



iphoneには id 型というのがある。

Cでの void がた。



んで、よくやるのが

- (IBAction) buttonAction: (id)sender;

こんなのがよくある。

IBAction は Interface Builderからのアクションをつなげる為のメソッドになるんですよね。
こんな説明でいいのかわかりませんが、メソッドを呼び出すタイミングを
Interface Builderで制御したい時に、戻り値を (IBAction)とします。
たぶん Interface Builder Action っていうことじゃないかと・・・。

そして、後ろにある引数の (id)sender。

今回はこれについて書いてみようと思います。

(id)がたのsender

このメソッドを呼び出した物が何かはわかりませんが、そいつのアドレスがsenderなのです。

つまり、クラスのポインター変数。かな?


自分はよくこんな風につかってます。

- (IBAction) do: (id)sender
{
UIButton* btn = sender;

[btn setTitle: @"aaa" forState: UIControlStateNormal];
}


このメソッドはUIButtonからしか呼ばれないように設計をし、
ボタンから呼ばれたらそのボタンのタイトルをaaaに変えてしまう恐ろしいメソッドです。。。笑

こういう風にする理由(UIButton* btn にわざわざ代入してメソッドを呼び出す) はエラーの起りにくい柔軟なプログラムを組むのはやっぱり難しいので、
このメソッドはボタンから呼ばれた時にだけ使うようにと使用する物が認識して使う為です。


が、これが本当はCocoa的なプログラミングの考え方ではないみたいです。

- (IBAction) do: (id)sender
{
if (sender respondsToSelector: @elector(setTitle: forState:))
{
[sender performSelector: @selector(setTitle: forState:)
withObject: @"これがCocoa的なプログラム"
withObject: UIControlStateNormal];
}
}

respondsToSelectorというメソッドで、そのオブジェクトがメソッドを所有しているのかを確認し、
performSelectorというメソッドで呼び出す。

ま、こんな簡単な例ではたいした違いもないし、実際自分もあまりわかってないのかも知れないけど、
cocoaだけの柔軟なメソッドの呼び出しという事で覚えよう!