Objective-C 文字列,NSString 【初級編 第16回】

この記事は2012年12月11日に書かれたものです。内容が古い可能性がありますのでご注意ください。


Objective-C 文字列,NSString 【初級編 第16回】

文字列について

前々回、前回とメモリ管理に関して話しましたが、今回はObjective-Cでの文字列の扱いに関して書いてみようと思います。
メモリ管理に関する話にも関連するところがあるので前の記事も参考にしてみてください。

C言語で文字列を表す場合はchar型の配列を使用していましたが、Objective-Cでは文字列を扱うクラスが用意されています。
その1つにNSStringクラスがあります。
このクラスはAppleのリファレンスによるとimmutable stringsとなっています。「immutable」というのは作成後に状態を
変更することができないオブジェクトのことです。まず基本的な使い方からいきます。
まずは実際使用してみましょう。

コードでの確認

Personオブジェクトに体重と身長だけではなく名前を格納できるようにしようとすると当然文字列を扱う必要がでてきます。
そこで「Person.h」「Person.m」「Manage.m」「main.m」を書き換えてみます。

Person.h

#import <Foundation/Foundation.h>
#import <Foundation/NSObject.h>

@interface Person:NSObject
{
    //属性を表す
    double height;
    double weight;
    NSString *name;
}

//アクセサ
-(double)height;
-(void)setHeight:(double)personHeight;
-(double)weight;
-(void)setWeight:(double)personWeight;
-(NSString*)name;
-(void)setName:(NSString*)personName;

//イニシャライザ 下が指定イニシャライザ
-(id)initWithWeight:(double)personWeigth height:(double)personHeight;
-(id)initWithWeight:(double)personWeight height:(double)personHeight name:(NSString*)personName;
@end

まずPerson.hから見ていきます。
9行目で名前格納用のNSString型のポインタを格納するインスタンス変数を用意しています。
17行目18行目では新たに用意したインスタンス変数の値にアクセスするためのアクセサを作成しています。
今回名前を格納するインスタンスを新たに作成するので指定イニシャライザを新たに宣言することにします。
22行目のところです。
その12でObjective-Cではクラス中で初期化する必要のあるインスタンス変数へ値を格納するための引数を、
すべて指定しているイニシャライザを特に指定イニシャライザということを説明しました。
そこで3つのインスタンス変数を初期化するために引数を3つ取る指定イニシャライザを宣言しました。

Person.m

#import "Person.h"

@implementation Person

    -(id)init{
        self = [self initWithWeight:65 height:1.71 name:@"nanashi"];
        if(self != nil){
        }
        return self ;
    }

    -(id)initWithWeight:(double)personWeight height:(double)personHeight{
        self = [self initWithWeight:personWeight height:personHeight name:@"nanashi"];
        if(self != nil){
        }
        return self;
    }
//指定イニシャライザ
    -(id)initWithWeight:(double)personWeight height:(double)personHeight name:(NSString*)personName{
        self = [super init];
        if(self != nil){
            weight = personWeight;
            height = personHeight;
            name = personName;
        }
        return self;
    }
    //アクセサ
    -(double)weight{
        return weight;
    }
    -(void)setWeight:(double)personWeight{
        weight = personWeight;
    }
    -(double)height{
        return height;
    }
    -(void)setHeight:(double)personHeight{
        height = personHeight;
    }
    -(NSString*)name{
        return name;
    }
    -(void)setName:(NSString*)personName{
        name = personName;
    }
@end

指定イニシャライザが新しいものに変わることにより既存のイニシャライザを書き換えます。
イニシャライザから指定イニシャライザを呼ぶようにするというのに従ってコードを変更しています。
体重、身長、名前を引数にとる指定イニシャライザの実装をしています。
もともと指定イニシャライザだった体重と身長を受け取るイニシャライザは内部で指定イニシャライザを呼び出すようにします。
ここでもし名前の指定がなかった場合、「nanasi」というものにしています。
文字列を表すときは「”」ダブルクォーテーションで挟むのですが、
頭に「@」を指定することで「@”文字列”」自体がオブジェクトのように扱えるようになります。
つまり[@”文字列” メッセージ]とやるようなことができるわけです。ただしこのオブジェクトは定数扱いとなります。

ページ:

1

2
  • このエントリーをはてなブックマークに追加

PAGE TOP