iPhone/iPad/iPod touch プログラミングバイブル
2011/07/18(月) 17:32 Objective-C親記事へこのエントリーをはてなブックマークに追加


Objective-Cについての説明は浅くて分かりにくいので、他の書籍が一緒に必要。

目次

第2章 Objective-Cの文法

2-1 変数

2-2 クラスとオブジェクト

オブジェクトのメモリ管理
リファレンスカウンタで管理されていてallocとreleaseで手動で開放もできるけど、
allocの時はautorelease。
hoge = [[Hoge alloc] init] autorelease];
ObjCで先頭に-がついたらそれはオブジェクトのメソッドを定義している
// (型)メソッド名: (型)引数
- (void)method:(id)object{
}
オブジェクトのメソッド呼び出しは
[オブジェクト名 メソッド名:引数]
が基本形で、複数の引数だとラベルというものが出てくる。
クラスのメソッド呼び出し
先頭に+がついてるのがクラスのメソッド宣言。
呼び出し方はオブジェクトと同じ
[クラス名 メソッド名:引数]
NSLog関数を使ってデバッグコンソールに情報は吐ける。

2-3 ループ

2-4 条件分岐

2-5 配列とコレクション

C言語のような普通の配列とNSMutableArrayクラスがある。
NSMutableArrayはpushとかpopとかlengthみたいな配列らしいメソッド(名前が違うけど)を持ってる。
    //配列の生成
    NSString* name[3];
    name[0]=@"iPhone3G";
    name[1]=@"iPhone3GS";
    name[2]=@"iPhone4";

    //配列の表示
    for (int i=0;i<3;i++) {
        [name[i] drawAtPoint:CGPointMake(0,i*26) withFont:font];
    }
    
    //NSMutableArrayオブジェクトの生成
    NSMutableArray* ary = [NSMutableArray array];
    // 配列に追加していく
    for(int i=0;i<3;i++){
        [ary addObject:[NSString stringWithFormat:@"iPad %d",i]];
    }
    // 配列を走査して表示
    // これのcountは一度別の変数に入れたほうが、効率的なのかな?
    // ary.countでもいいみたいけど、どっちがいいんだか…
    for (int i=0; i<[ary count]; i++) {
        NSString* text=[ary objectAtIndex:i];
        [text drawAtPoint:CGPointMake(0, (4+i)*26) withFont:font];
    }
追記

簡単にまとめると、明示的にクラス名を指定して変数を宣言してるときはドット記法で、id型で受けるべき時はメソッドでっていうのが一応の使い分け
http://blog.livedoor.jp/faulist/archives/1480850.html


もう一つ、データの集合を入れるクラスとしてNSMutableDictionaryがある。
これはハッシュ的なもの。
    // NSMutableDictionary オブジェクト 
    NSMutableDictionary* dic = [NSMutableDictionary dictionary];
    // いわゆるハッシュなのでkey = valueなものを指定する
    // けど、ObjCでは value = key ときもちわるい
    // 一個づつsetできる
    [dic setObject:@"サポート対象外" forKey:@"iPhone3G"];
    [dic removeObjectForKey: @"iPhone3G"];
    dic = [NSMutableDictionary dictionaryWithObjectsAndKeys:
        @"換え時は近い" , @"iPhone3GS",
        @"まだ新しい", @"iPhone4G",
        nil
    ];
    NSArray *keys = [dic allKeys];
    for (int i=0; i<[keys count]; i++) {
        NSString* text = [dic objectForKey:[keys objectAtIndex:i]];
        [text drawAtPoint:CGPointMake(0, (8+i)*26) withFont:font];
        
    }

2-6 クラスの実装

インスタンス変数を他のクラスに公開する(getter/setterを通しての意味で)ために@propertyを使う。
@interface Person : NSObject {
    NSString *_name;
    int _age;
}

@property (nonatomic, retain)NSString *name;
@property int age;
ただ、これだけでは宣言しただけなので、getter/setterの実装をする必要がる。それを楽に行うのが@synthesizeコンパイラディレクティブ。
@synthesizeではプロパティ名=インスタンス変数名を指定すれば、getter/setterをコンパイル時に生成してくれる。またプロパティ名とインスタンス変数名が一致するなら、インスタンス変数名は省略できる。
だけど、インスタンス変数名には末尾に_をつけるなどして分けた方がよい。
@implementation Person
// プロパティの実装
// プロパティ名 = インスタンス変数
@synthesize name = _name;
@synthesize age = _age;
プロトコルとは
ObjCは多重継承ができない。
プロトコルは複数継承したり、プロトコルがプロトコルを継承したりできる。
プロトコルはインターフェースに当たる部分。
カテゴリとは
カテゴリとは1つのクラスを複数のクラスに分離したり、クラスに新しい機能をつけたりするObjCの文法
クラス名(カテゴリ) という記述で、元々のクラスに対しても機能を追加できたりするので便利。
#import <Foundation/Foundation.h>
// Trimカテゴリの宣言
@interface NSString(Trim)
- (NSString *)trim;
@end
// Trimカテゴリの実装
@implementation NSString(Trim)
- (NSString *)trim {
    return [self stringByTrimmingCharactersInSet:
                 [NSCharacterSet whitespaceAndNewlineCharacterSet]];
}
@end

int main (int argc, const char * argv[])
{

    NSAutoreleasePool * pool = [[NSAutoreleasePool alloc] init];

    NSString *str = @"         文字列      ";
    NSLog(@"%@", [str trim]);

    [pool drain];

    return 0;
}

第3章 基本API

3-1 文字列の描画

3-2 イメージの描画

3-3 図形の描画

3-4 タッチイベントの処理

3-5 タイマーの処理

TimerはNSTimer scheduledTimerWithTimeIntervalで、setTimeIntervalとsetTimeout両方を含んでいる感じ。setTimeIntervalっぽいものを書いてみると以下のような感じ。
- (NSTimer *)setTimeInterval:(int)msec WithSelector:(NSString *)selector {
    SEL method = NSSelectorFromString(selector);// セレクタ

    return [NSTimer
            scheduledTimerWithTimeInterval:(float)msec/1000 target:self selector:method userInfo:nil repeats:YES];
}
タイマーが動いているとdeallocは呼ばれないので、[_timer invalidate];で停止してからビューのメモリを解放する。

第4章 ユーザーインタフェース

4-1 ラベルとイメージビュー

iOSアプリはMVCアーキテクチャを元に構成される。
UILabelやUIImageViewを作って、viewに足してて追加する。
[self.view addSibview:label];
ビューの縦横回転は以下のメソッドがYESを返すようになってる時に、回転に追従するようになる。
シミュレーターではcommand+左右で回転できる。
- (BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)interfaceOrientation
{
    // Return YES for supported orientations
    return YES;
}

4-2 ボタンとアラート

4-3 テキストフィールド

4-4 テキストビュー

4-5 スライダーとスイッチ

4-6 WEBビュー

4-7 マップビュー

4-8 ナビゲーションとテーブルビュー

4-9 ピッカービュー


名前:  非公開コメント   

  • TB-URL  http://efcl.info/adiary/0125/tb/