頭と尻尾はくれてやる!

パソコンおやじのiPhoneアプリ・サイト作成・運営日記


tagの設定を忘れていた

Study CoreData 9 ~こだわり続けるのは大変だ~ « Everything was born from Love
↑このCore Dataを勉強するシリーズの9ではまった部分のメモ。

自分のレベルだと、Core Data以外の所もいろいろと勉強になるので、なるべくアプリがきちんと動くところまで仕上げるのを目標にしております。

今回の記事内にあるコードをそのまま入力していったもののうまく動かない、、、
ってことで、いろいろとチェックしつつようやくたどり着いた結論は、EditableViewController内で今回新しく作ったボタンの部分(インスタンス名はmoreButtonですね)に、tagを設定するのを忘れていたんですよ。

記事内だと
2. [More Details]ボタンを追加する。
ってところでコードが紹介されていますが、説明の順番の都合か、
moreButton.tag = TAG_SUB_BUTTON;
というのがありません。

これを追加すれば、意図通りに動きました!

ふー、なんとか9をクリア!


プロパティをこんな風に設定できるとは知らなかったが、、、

Study CoreData 0 序章 ~日本語で覚えなくっても良いじゃんね~ « Everything was born from Love
↑今回もこのシリーズに出てくるサンプルコードで引っかかったのですが、、、

前回(「@synthesizeの後にイコールなんとかって何?」)書いたPersonクラスでいうとこんな感じ。
myAgeってプロパティを追加したとして、実装部にこういう記述があるようなもの。
-(NSInteger) myAge {
    return 19;
}
すると、これを使う側からhe.myAgeとすると19って値が帰ってくる!

ふーん!
プロパティってこんな風にも書けるのかあ!

なんて思ったんだけど、これ単にアクセサを自分で実装するとこんな感じになるってだけなんだよな、、、
たいてい、セッター、ゲッターを指定するのに@propertyと@synthesizeで書くから基本的なことをすっかり忘れていたわ、、、orz


@synthesizeの後にイコールなんとかって何?

人様のコードを見るというのはホント勉強になりますね。

Study CoreData 0 序章 ~日本語で覚えなくっても良いじゃんね~ « Everything was born from Love
↑今はこのシリーズで CoreDataってものがどんなのか見てたりします。

ところが、 CoreData以前に基本的なところで躓いててなかなか進みません、、、
そんなところをメモしておきます。

出てくるサンプルコードでよくわからなかったのが、
@synthesize fetchedResultsController=fetchedResultsController_;
というように@synthesizeのプロパティ名の後に、イコールごにょごにょって続く形。

なんだこりゃ?
ってことで調べてみたところ、こんな記事が。↓
【コラム】ダイナミックObjective-C (102) プロパティ(2) - プロパティの宣言 | エンタープライズ | マイコミジャーナル
プロパティ名の後に、インスタンス変数名を指定してやればいい。これで、プロパティを任意のインスタンス変数と関連づけることができる。

フーン、、、
とりあえず、試してみた。
Personクラスってベタなクラスを作りました。
ヘッダー部分(Person.h)はこんな感じ。
@interface Person : NSObject {
    NSString *_myName;
}
@property(nonatomic, retain) NSString *myName;
-(void)sayHello;
@end
プロパティにmyName、文字列型のインスタンス変数名に_myName、 sayHelloってメソッドを持ちますよってことで。

実装部分(Person.m)はこんな感じ。
@implementation Person

@synthesize myName;//(1)
//@synthesize myName = _myName;//(2)

-(void)sayHello{
    NSLog(@"Hello, I'm %@! (_myName)",_myName);
    NSLog(@"Hello, I'm %@! (self.myName)",self.myName);
}
@end
synthesizeでプロパティ名のみを(1)、プロパティ名の後にイコールとインスタンス名を記述したのが(2)としますね。

これを使うクラスに以下のように記述します。
Person *he = [[Person alloc] init];//初期化
[he sayHello];//メソッド実行
he.myName = @"Taro";//ここで"Taro"をセットする
NSLog(@"--- set Taro ---");
[he sayHello];//もう一度メソッド実行
実行結果の比較がこれ↓

実行結果

↑上部が(1)で下部が(2)です。
ほれ、(2)だとプロパティ"myName"をTaroとセットしたのに、 Personクラス内部のインスタンス(_myName)も、Taroを指している!!!
こういうことかっ!

ちなみに、逆にPersonクラス内部で_myNameをたとえば"Jiro"に変更しても、それを使う側からプロパティ(myName)へアクセスするとちゃんと"Jiro"になるんですよ!

ほー!
機能はわかった。
ただ、この@synthesizeでプロパティとインスタンス変数を関連づける技(?)が何に役立つのかまだピンと来ませんが、とりあえず覚えておこうっと。


プロパティなのにリファレンスのメソッドを探してしまう

[button setFrame:CGRectMake(x, y, width, height) ];

↑例えば上のようなコードがあった場合、Xcodeのリファレンスで確認する時、よく間違えるんです。
ここでbuttonはUIButtonクラスのオブジェクトとします。

よくやってしまうのが、UIButtonクラスのリファレンスで、Instance Methodsの部分を探す。
ないなー、UIButtonクラスで定義されてるんじゃないなー
ということで、スーパークラスのInstance Methodsを順に探すんです。

UIButton → UIControl → UIView → UIResponder → NSObject
と順に最後まで探して、、

あ、これプロパティじゃね?
ってようやく気付くわけです。

frameってプロパティをsetFrame:のようにメソッドのごとく表現できるのがいいのか悪いのかよくわかりませんが、初心者にとっては慣れるまで引っかかるところであります。


意外なBIG第457回の結果!

我が目を疑ったぞ。
11試合中、たったの1試合とな、、、!
1試合も的中しなことがあれば、一切足を洗うと決めてるので、あわや、、、ってところだったな。

開催回 開催日 くじ種類 購入日 的中数 備考
第457回 7/17 ~ 7/18 BIG1000 2010年07月16日 1/11 ←今回更新
え???
第454回 6/9 ~ 6/13 BIG1000 2010年06月09日 4/11 一つずつだな
第453回 6/5 ~ 6/6 BIG1000 2010年06月04日 3/11 がんばれよ
第452回 5/29 ~ 5/30 BIG1000 2010年05月28日 2/11 (゚д゚;) 2コダケ?
第449回 5/15 ~ 5/16 BIG1000 2010年05月14日 5/11 うーん
第449回 5/15 ~ 5/16 BIG プレゼント 5/14 おいおい
第448回 5/8 ~ 5/9 BIG1000 2010年05月07日 3/11 (゚д゚;) コレダケ?
第446回 5/1 ~ 5/2 BIG1000 2010年04月30日 6/11 見せ場なし
第444回 4/24 ~ 4/25 BIG 2010年04月23日 5/14 orz
第443回4/17 ~ 4/18BIG2010年04月16日6/14-
第441回4/10 ~ 4/11BIG2010年04月08日6/14-
第440回4/3 ~ 4/4BIG2010年04月02日8/14もう一息
第438回3/27 ~ 3/28BIG2010年03月26日6/14-
第437回3/20 ~ 3/21BIG2010年03月19日9/14あと1つ!
第436回3/13 ~ 3/14BIG2010年03月12日5/14-





Copyright ©頭と尻尾はくれてやる!. Powered by FC2 Blog. Template by eriraha.