iPhone, iPad
              アプリ開発勉強会#3



12年12月7日金曜日
Objective-Cでの型
                文字列         NSString

                 配列         NSArray

                ハッシュ      NSDictionary

              テキストフィールド   UITextField

                ボタン        UIButton


                                などなど...
12年12月7日金曜日
先頭が”NS”ではじまる型はObjective-Cの基本型です。

    先頭がUIではじまる型はiOSでのユーザーインターフェースに対する操作、データ取
    得等の機能を提供する型です。




              iOSの構成
                 アプリ

          Cocoa Touch フレームワーク

          Media(グラフィックスetc)

         Core Services(データ管理etc)

                 Core OS


12年12月7日金曜日
よく使う型をいくつかみてみます




12年12月7日金曜日
文字列型:NSString



    /* リテラル(先頭に@を付ける) */
    NSString *str = @”こんにちは”;

    /* 埋め込み */
    NSString *name = @”ひろえ”;
    NSString *str = [[NSString alloc] initWithFormat:@”私は%@です”, name];

    /* 連結 */
    NSString *str1 = @”わたしは”;
    NSString *str2 = @”ひろえです”;
    NSString *str3 = [str1 stringByAppendingString : str2];

    /* 文字列の長さ(バイト数ではなくユニコード文字列の文字数) */
    NSInteger strlen = [str3 length];




12年12月7日金曜日
可変文字列型:NSMutableString

              NSMutableString型はNSStringに破壊的メソッドを追加したものです。
     NSString型のオブジェクトに対してmutableCopyメソッドを呼ぶとNSMutableStringのイ
                                 ンスタンスを生成出来ます。



    /* 与えられた文字列をもとの文字列に追加する */
    NSMutableString *str1 = [@”こんにちは” mutableCopy] ;
    [str1 appendingString : @”世界”]
    結果 => @”こんにちわ世界”;



    /* 指定範囲を文字列を与えられた文字列で置換する */
    NSMutableString *str = @”私はRubyが好きです”;
    [str replaceCharactersInRange : NSMakeRange(2, 4) withString:@”Objective-C”];
    結果 => @”私はObjective-Cが好きです”;




12年12月7日金曜日
NSStringでの文字列の連結と
    /* 連結 */
    NSString *str1 = @”わたしは”;
    NSString *str2 = @”ひろえです”;
    NSString *str3 = [str1 stringByAppendingString : str2];



                                NSMutableStringでの文字列の連結の
    NSMutableString *str1 = [@”こんにちは” mutableCopy];
    [str1 appendingString : @”世界”]
    結果 => @”こんにちわ世界




                                              違いは...?




12年12月7日金曜日
NSStringでの文字列の連結の場合
    /* 連結 */
    NSString *str1 = @”わたしは”;
    NSString *str2 = @”ひろえです”;
    NSString *str3 = [str1 stringByAppendingString : str2];


    str1                                                      str2
              @”私は”                                             @”ひろえです”




                                     str3

                                      @”私はひろえです”




      NSStringでの連結はもとの文字列str1, str2は何も変化せず、両者を連結した新たなオ
                                    ブジェクトを作り出します。

12年12月7日金曜日
新たなオブジェクトを生成する必要があるので必要な処理を多く、
                        コストがかかります。

          ただし、もとのオブジェクトは何も変化しないので、より安全といえます。




12年12月7日金曜日
対して...




12年12月7日金曜日
NSMutableStringでの文字列の連結の
    NSMutableString *str1 = [@”こんにちは” mutableCopy];
    [str1 appendingString : @”世界”]
    結果 => @”こんにちわ世界




    str1                                              str2
              @”私は”                                     @”ひろえです”




12年12月7日金曜日
NSMutableStringでの文字列の連結の
    NSMutableString *str1 = [@”こんにちは” mutableCopy];
    [str1 appendingString : @”世界”]
    結果 => @”こんにちわ世界




    str1                                              str2
         @”私はひろえです”                                     @”ひろえです”




                       操作対象のオブジェクトを直接変更します。



12年12月7日金曜日
既にあるオブジェクトに対して直接変更を行うので、
               速度が速く、消費メモリも少なくてすみます。

     ただし、スレッド等使用して同時に処理が行われたりすると再現の難しい不具合を発
                    生する可能性があります。




12年12月7日金曜日
配列:NSArray




    /* 要素を渡してインスタンスを生成 */
    NSArray *array = [[NSArray alloc] initWithObjects:@”helo”, @”world”, nil];

    /*指定番目の値を取得 */
    NSString str = [array objectAtIndex:1];
    結果:@”world”

    /* 要素数を取得 */
    NSInteger obj_count = [array count];
    結果:2




12年12月7日金曜日
配列:NSMutableArray

              NSMutableArray型はNSArrayに破壊的メソッドを追加したものです。




    /*末尾に要素を追加 */
    NSMutableArray *array = [[NSMutableArray alloc] initWithObjects:@”helo”, @”world”, nil];
    [array addObject : @”goodbye”];


    /*指定番目の値を削除 */
    [array removeObjectAtIndex : 2];




12年12月7日金曜日
整数: NSInteger 小数 CGFloat, double




              これらはC言語レベルでのintおよびfloatまたはdoubleと同じです。



                           マクロで定義してあり...



                  NSIntegerは環境によってintまたはlongになります。
              CGFloatは環境によって自動的にfloatまたはdoubleになります。




     ほとんどの場合はintやfloatを直接書くよりも、NSIntegerやCGFloatで定義しておいた
         方が、コードの再利用生や将来のiOS側の変更に強いコードになりそうです。




12年12月7日金曜日
ここでひとつ問題が




12年12月7日金曜日
NSArrayなどの要素として渡せるのは”オブジェクト”です。
                                  たとえば下のようなイメージ。



    NSString *str1 = @”こんにちわ”;
    NSString *str1 = @”世界”;
    NSArray *array = [[NSArray alloc] initWithObjects : str1, str2, nil]




                        str1                              str2
   *array =                                                       @”世界”
                            @”こんにちは”




12年12月7日金曜日
でも実際には下のようなイメージ。




              *str1            メモリ          *str2
                  546                  234




                                                    @”世界”
              @”こんにちは”




                      *array
                                 546, 234


12年12月7日金曜日
配列に収まっているのは実際には「オブジェクトの番地」であり、
              参照された際には番地をたどってオブジェクトを参照しています。




12年12月7日金曜日
ところが、オブジェクトは変数にメモリの番地が入っているのに対して

         NSIntegerやCGFloatなどのC言語レベルの値はメモリに直接値が入ってます。




              NSString   *str1      NSInteger   int1
                             1003                  3




                         @”こんにちは”



12年12月7日金曜日
このままではNSInteger型やCGFloat型をObjective-Cの配列に入れる事が出来ません。




12年12月7日金曜日
そこで。




12年12月7日金曜日
配列:NSNumber

     NSNumber型は数値をラップする型です。Objective-Cの配列やハッシュに値を納める
              場合は、一旦NSNumberでくるんでからオブジェクトとして渡します。



    /* int型からオブジェクトを生成 */
    NSNumber *num1 = [NSNumber numberWithInteger : 5];

    /* float型からオブジェクトを生成 */
    NSNumber *num2 = [NSNumber numberWithFloat : 5.0f];


    /* NSNumber型のオブジェクトで配列を生成 */
    NSArray array = [[NSArray alloc] initWithObjects: num1, num2, nil];




12年12月7日金曜日
配列:NSDictionary

               NSDictionary型はハッシュテーブルの機能を提供するクラスです。


                             Rubyで表現するとこんなかんじのやつ
                              dic = {“name” => “shin”,
                                    “age”     => 37,
                                    “country” => “日本”}




    /* オブジェクトを生成 */
    NSDictionary *dic = [[NSDictionary alloc] initWithObjectsAndKeys: @”val1”, @”key1”,
                                                                      @”val2”, @”key2”,
                                                                      nil];

    /* 値を参照 */
    NSString *str = [dic objectForKey:@”key1”];
    結果:@”val1”

12年12月7日金曜日
配列:NSMutableDictionary

        NSMutableDictionary型はNSDictionary型に破壊的メソッドを追加したものです。




 /* オブジェクトを生成 */
 NSMutableDictionary *dic = [[NSDictionary alloc] initWithObjectsAndKeys: @”val1”, @”key1”,
                                                                         @”val2”, @”key2”,
                                                                         nil];

 /* キー、値のペアを追加 */
 [dic setObject : @”val3” forKey : @”key3”];


 /* キー、値のペアを削除 */
 [dic removeObjectForKey : @”key3”];




12年12月7日金曜日
おわり




12年12月7日金曜日

iPhone, iPad アプリ開発勉強会#3

  • 1.
    iPhone, iPad アプリ開発勉強会#3 12年12月7日金曜日
  • 2.
    Objective-Cでの型 文字列 NSString 配列 NSArray ハッシュ NSDictionary テキストフィールド UITextField ボタン UIButton などなど... 12年12月7日金曜日
  • 3.
    先頭が”NS”ではじまる型はObjective-Cの基本型です。 先頭がUIではじまる型はiOSでのユーザーインターフェースに対する操作、データ取 得等の機能を提供する型です。 iOSの構成 アプリ Cocoa Touch フレームワーク Media(グラフィックスetc) Core Services(データ管理etc) Core OS 12年12月7日金曜日
  • 4.
  • 5.
    文字列型:NSString /* リテラル(先頭に@を付ける) */ NSString *str = @”こんにちは”; /* 埋め込み */ NSString *name = @”ひろえ”; NSString *str = [[NSString alloc] initWithFormat:@”私は%@です”, name]; /* 連結 */ NSString *str1 = @”わたしは”; NSString *str2 = @”ひろえです”; NSString *str3 = [str1 stringByAppendingString : str2]; /* 文字列の長さ(バイト数ではなくユニコード文字列の文字数) */ NSInteger strlen = [str3 length]; 12年12月7日金曜日
  • 6.
    可変文字列型:NSMutableString NSMutableString型はNSStringに破壊的メソッドを追加したものです。 NSString型のオブジェクトに対してmutableCopyメソッドを呼ぶとNSMutableStringのイ ンスタンスを生成出来ます。 /* 与えられた文字列をもとの文字列に追加する */ NSMutableString *str1 = [@”こんにちは” mutableCopy] ; [str1 appendingString : @”世界”] 結果 => @”こんにちわ世界”; /* 指定範囲を文字列を与えられた文字列で置換する */ NSMutableString *str = @”私はRubyが好きです”; [str replaceCharactersInRange : NSMakeRange(2, 4) withString:@”Objective-C”]; 結果 => @”私はObjective-Cが好きです”; 12年12月7日金曜日
  • 7.
    NSStringでの文字列の連結と /* 連結 */ NSString *str1 = @”わたしは”; NSString *str2 = @”ひろえです”; NSString *str3 = [str1 stringByAppendingString : str2]; NSMutableStringでの文字列の連結の NSMutableString *str1 = [@”こんにちは” mutableCopy]; [str1 appendingString : @”世界”] 結果 => @”こんにちわ世界 違いは...? 12年12月7日金曜日
  • 8.
    NSStringでの文字列の連結の場合 /* 連結 */ NSString *str1 = @”わたしは”; NSString *str2 = @”ひろえです”; NSString *str3 = [str1 stringByAppendingString : str2]; str1 str2 @”私は” @”ひろえです” str3 @”私はひろえです” NSStringでの連結はもとの文字列str1, str2は何も変化せず、両者を連結した新たなオ ブジェクトを作り出します。 12年12月7日金曜日
  • 9.
    新たなオブジェクトを生成する必要があるので必要な処理を多く、 コストがかかります。 ただし、もとのオブジェクトは何も変化しないので、より安全といえます。 12年12月7日金曜日
  • 10.
  • 11.
    NSMutableStringでの文字列の連結の NSMutableString *str1 = [@”こんにちは” mutableCopy]; [str1 appendingString : @”世界”] 結果 => @”こんにちわ世界 str1 str2 @”私は” @”ひろえです” 12年12月7日金曜日
  • 12.
    NSMutableStringでの文字列の連結の NSMutableString *str1 = [@”こんにちは” mutableCopy]; [str1 appendingString : @”世界”] 結果 => @”こんにちわ世界 str1 str2 @”私はひろえです” @”ひろえです” 操作対象のオブジェクトを直接変更します。 12年12月7日金曜日
  • 13.
    既にあるオブジェクトに対して直接変更を行うので、 速度が速く、消費メモリも少なくてすみます。 ただし、スレッド等使用して同時に処理が行われたりすると再現の難しい不具合を発 生する可能性があります。 12年12月7日金曜日
  • 14.
    配列:NSArray /* 要素を渡してインスタンスを生成 */ NSArray *array = [[NSArray alloc] initWithObjects:@”helo”, @”world”, nil]; /*指定番目の値を取得 */ NSString str = [array objectAtIndex:1]; 結果:@”world” /* 要素数を取得 */ NSInteger obj_count = [array count]; 結果:2 12年12月7日金曜日
  • 15.
    配列:NSMutableArray NSMutableArray型はNSArrayに破壊的メソッドを追加したものです。 /*末尾に要素を追加 */ NSMutableArray *array = [[NSMutableArray alloc] initWithObjects:@”helo”, @”world”, nil]; [array addObject : @”goodbye”]; /*指定番目の値を削除 */ [array removeObjectAtIndex : 2]; 12年12月7日金曜日
  • 16.
    整数: NSInteger 小数CGFloat, double これらはC言語レベルでのintおよびfloatまたはdoubleと同じです。 マクロで定義してあり... NSIntegerは環境によってintまたはlongになります。 CGFloatは環境によって自動的にfloatまたはdoubleになります。 ほとんどの場合はintやfloatを直接書くよりも、NSIntegerやCGFloatで定義しておいた 方が、コードの再利用生や将来のiOS側の変更に強いコードになりそうです。 12年12月7日金曜日
  • 17.
  • 18.
    NSArrayなどの要素として渡せるのは”オブジェクト”です。 たとえば下のようなイメージ。 NSString *str1 = @”こんにちわ”; NSString *str1 = @”世界”; NSArray *array = [[NSArray alloc] initWithObjects : str1, str2, nil] str1 str2 *array = @”世界” @”こんにちは” 12年12月7日金曜日
  • 19.
    でも実際には下のようなイメージ。 *str1 メモリ *str2 546 234 @”世界” @”こんにちは” *array 546, 234 12年12月7日金曜日
  • 20.
    配列に収まっているのは実際には「オブジェクトの番地」であり、 参照された際には番地をたどってオブジェクトを参照しています。 12年12月7日金曜日
  • 21.
    ところが、オブジェクトは変数にメモリの番地が入っているのに対して NSIntegerやCGFloatなどのC言語レベルの値はメモリに直接値が入ってます。 NSString *str1 NSInteger int1 1003 3 @”こんにちは” 12年12月7日金曜日
  • 22.
  • 23.
  • 24.
    配列:NSNumber NSNumber型は数値をラップする型です。Objective-Cの配列やハッシュに値を納める 場合は、一旦NSNumberでくるんでからオブジェクトとして渡します。 /* int型からオブジェクトを生成 */ NSNumber *num1 = [NSNumber numberWithInteger : 5]; /* float型からオブジェクトを生成 */ NSNumber *num2 = [NSNumber numberWithFloat : 5.0f]; /* NSNumber型のオブジェクトで配列を生成 */ NSArray array = [[NSArray alloc] initWithObjects: num1, num2, nil]; 12年12月7日金曜日
  • 25.
    配列:NSDictionary NSDictionary型はハッシュテーブルの機能を提供するクラスです。 Rubyで表現するとこんなかんじのやつ dic = {“name” => “shin”, “age” => 37, “country” => “日本”} /* オブジェクトを生成 */ NSDictionary *dic = [[NSDictionary alloc] initWithObjectsAndKeys: @”val1”, @”key1”, @”val2”, @”key2”, nil]; /* 値を参照 */ NSString *str = [dic objectForKey:@”key1”]; 結果:@”val1” 12年12月7日金曜日
  • 26.
    配列:NSMutableDictionary NSMutableDictionary型はNSDictionary型に破壊的メソッドを追加したものです。 /* オブジェクトを生成 */ NSMutableDictionary *dic = [[NSDictionary alloc] initWithObjectsAndKeys: @”val1”, @”key1”, @”val2”, @”key2”, nil]; /* キー、値のペアを追加 */ [dic setObject : @”val3” forKey : @”key3”]; /* キー、値のペアを削除 */ [dic removeObjectForKey : @”key3”]; 12年12月7日金曜日
  • 27.