2011-07-18 3 views
2

次の2つの初期化方法を考慮してください。パラメータとして渡されたNSStringをカスタム初期化メソッドに割り当てる必要がありますか?

最初のメソッドは、パラメータの値をそれぞれのNSStringプロパティに渡しますが、2番目のプロパティはプロパティを割り当て、initWithString:メソッドを使用してプロパティを初期化します。後者の例の配分は必要ですか?

ありがとうございます。

-(id)initWithTitle:(NSString *)theTitle muscleGroup:(NSString *)theMuscleGroup equipment:(NSString *)theEquipment { 
    if((self = [super init])){ 
     title = theTitle; 
     muscleGroup = theMuscleGroup; 
     equipment = theEquipment; 
    } 
    return self; 
} 

-(id)initWithTitle2:(NSString *)theTitle muscleGroup:(NSString *)theMuscleGroup equipment:(NSString *)theEquipment { 
    if((self = [super init])){ 
     title = [[NSString alloc] initWithString:theTitle]; 
     muscleGroup = [[NSString alloc] initWithString:theMuscleGroup]; 
     equipment = [[NSString alloc] initWithString:theEquipment]; 
    } 
    return self; 
} 

答えて

5

あなたは、文字列の所有権を取得されていないため、最初の例では、安全ではないので、彼らが後で別の場所にリリースされている場合は、あなたのプログラムは、すべてがcrashy取得します。第二の例は、その問題を修正し、完璧にうまく動作しますが、より簡潔thusly書かれている:

-(id)initWithTitle2:(NSString *)theTitle muscleGroup:(NSString *)theMuscleGroup equipment:(NSString *)theEquipment { 
    if((self = [super init])){ 
     title = [theTitle copy]; 
     muscleGroup = [theMuscleGroup copy]; 
     equipment = [theEquipment copy]; 
    } 
    return self; 
} 

NSStringのは、あなたが#2で何をしているかを行うことができますコピーコンストラクタ(-initWithString:)を、与えるが、すべてのクラスではありません。 copyは、クラスにNSCopyingプロトコルを実装する必要がありますが、Cocoa API開発者がオブジェクトをコピーできると考えている方法に準拠しています。

2

パラメータオブジェクトは、渡すとコピーされません。したがって、最初の例が必ずしも正常に動作するとは限りません。文字列をどのように初期化したかによって異なります。

次は(あなたのdeallocメソッドでオブジェクトを解放するために覚えているが)安全です:

-(id)initWithTitle:(NSString *)theTitle muscleGroup:(NSString *)theMuscleGroup equipment:(NSString *)theEquipment { 
    if((self = [super init])){ 
     title = [theTitle retain]; 
     muscleGroup = [theMuscleGroup retain]; 
     equipment = [theEquipment retain]; 
    } 
    return self; 
} 
2

例1は、ポインタを割り当てます。オブジェクトを保持しようとせず、オブジェクトの内容を変更する外部のものに対して脆弱です。

最初の場所で引数がどのように構築されるかによって動作する可能性があります。

例2は文字列オブジェクトをコピーして保持します。あなたがdeallocで解放する限り、それは好ましいメソッドです。

FWIW

title = [theTitle copy];

又は

title = [[NSString stringWithString:theTitle] retain];

例2

に等しく良好です
関連する問題