0

Objective-Cの(id)メソッドは、後でのallocみ初期化するために使用されますか?

NSString *stringC = @"My World"; 
NSString *sample = [[NSString alloc] initWithString:stringC];
4

2 に答える 2

2

Objective-Cのinitメソッドは、新しく割り当てられたインスタンスのみを対象としています。その理由は次のとおりです。

selfinitメソッドは、関連付けられたものとは異なるポインターを再割り当てして返すことができます(これが、変数を常にinitの戻り値として割り当てるalloc理由です)。これは、以前に初期化されたオブジェクトでinitを呼び出すと、新しいメモリへのポインタが返される可能性があることを意味します。これにより、いくつかの問題が発生します。

まず、変数に新しいポインターを割り当てない場合、それは無意味またはさらに悪いことでした。次に、「古い」オブジェクトへの追加のポインタが「ぶら下がっている」ようになり、厄介になります。

構成に関しては、@"foo"Cのconst文字列にほぼ類似しています(NSStringsは不変ですが、ところで)、これは、揮発性文字へのポインターではなく、NSStringインスタンスへのポインターであり、必要ありません。initそれに。誤ってアスタリスクを省略したかどうかはわかりませんが、@ ""はNSStringへのポインタを生成するため、次の行と同様に、その行にはアスタリスクが必要です。

IDに関する注記

idはObjective-Cのvoid * オブジェクト専用です。これは基本的にコンパイラに2つのことを伝えます。

  1. これはポインタです
  2. 指摘されているのは「オブジェクト」です

そして#2には1つの典型的な意味があります:あなたはそれにメッセージを送ることができます

void *と同様に、他のオブジェクトタイプが必要で、コンパイラが文句を言わない場合は、タイプキャストを(id)として渡すことで回避できます。

于 2012-08-31T05:59:26.457 に答える
0

init *メソッドの前に、割り当てる必要があると言った方がよいでしょう。

例えば、

NSString * test = [NSString stringWithFormat:@"hello world"];

IDも返しますが、「alloc」呼び出しの後ではありません。

于 2012-08-31T05:54:51.667 に答える