2011年1月19日水曜日

NSArray 逆順に高速列挙

NSArray * array=[NSArray arrayWithObjects:
          @"a",@"b",@"c",@"d",@"e",nil];
for(NSString*obj in [array reverseObjectEnumerator]){
  NSLog(@"word=%@",obj); 
}
eから順にaまで出力されます。よしよし。

ちなみに、高速列挙中に列挙しているarrayの要素を
足したり消したりしたらエラーになる。

クラス比較

配列に入っているオブジェクトが何のクラスかで処理を変える時等に使えます。
比較クラスを継承したサブクラスの場合も結果はTRUEになるので注意。

BOOL stringflg = [obj isKindOfClass:[NSString class]];

2011年1月13日木曜日

drawRect 再描画の注意点

UIViewなどにdrawRectで描画した線や図形を消去、再描画するには
//全再描画
[drawView setNeedsDisplay];
//一部再描画なら
[drawView setNeedsDisplayInRect:CGRectmake(0,0,100,100)];
をする。注意したいのはdrawViewが元々透明でなければ
前回分の描画が残ってしまうということ。

drawViewのinitWithFrameメソッド内にでも透明プロパティを設定すること!
※初期値は不透明の設定
drawView.opaque=YES
drawRectで描いたものはUIViewの背景色みたいな扱いだから
違う位置に再描画しても前回分が残ってしまうのかなーとか思うことに。
ちなみに前回分を消去して画面をクリアにしたい場合は、View自体になんか
フラグでも持たせてdrawRect内の描画部分をフラグによって素通りするように
すればいいと思います。

?:(クエスチョン、コロン)の3項演算

たまに見かけるこれ、

 式1?式2:式3

3項演算というらしい。
式1の結果がTRUEなら式2実行、式3無視。
式1の結果がFALSEなら式3実行、式2無視という動き。
式1の結果は必ずBoolean型でないと駄目。

int c = ( a>b ? a+b : a-b);
NSLog(@"c=%d",c);

a=3,b=2の時、cは5
a=2,b=3の時、cは-1
となる。 

2011年1月6日木曜日

NSNotificationの解除

NSNotificationを登録したらdeallocで以下を入れておく。
登録したNotificationを全て削除できる。便利。
[[NSNotificationCenter defaultCenter] removeObserver: self];

notification名を指定して削除もできる。
一つだけ削除するとか何か意味があるんだろうか…?
[[NSNotificationCenter defaultCenter] removeObserver:self name:@"notificationname" object:nil];