2

ここに初投稿。以前、Objective-C のチュートリアルを読んでいたところ、次のような NSString インスタンス変数がいくつか作成されていることがわかりました。

@implementation MyViewController {
NSString *stringOne;
NSString *stringTwo;
NSString *stringThree;
NSString *stringFour;
NSString *stringFive;
}

そして、次のように ViewDidLoad で単純に使用しました。

- (void)viewDidLoad
{
[super viewDidLoad];

stringOne = @"Hello.";
stringTwo = @"Goodbye.";
stringThree = @"Can't think of anything else to say.";
stringFour = @"Help...";
stringFive = @"Pheww, done.";
}

文字列をインスタンス化せずに、どのようにこれを行ったのでしょうか? なぜこれが機能するのですか?確かにstringOne = [NSString stringFromString:@"Hello."];、単に行う前に、オブジェクトを適切に割り当てて初期化するなどのことをする必要がありますstringOne= @"Hello.";

これがばかげた質問なら申し訳ありませんが、これらのささいなことで私は投げ出されます。

ありがとう、マイク

4

4 に答える 4

6

Apple String Programming Guideから:

文字列の作成

ソース コードで文字列オブジェクトを作成する最も簡単な方法は、Objective-C の @"..." コンストラクトを使用することです。

NSString *temp = @"Contrafibularity";

この方法で文字列定数を作成する場合は、UTF-8 文字を使用する必要があることに注意してください。このようなオブジェクトはコンパイル時に作成され、プログラムの実行中に存在します。コンパイラは、このようなオブジェクト定数をモジュールごとに一意にし、割り当てが解除されることはありません。他の文字列と同じように、メッセージを文字列定数に直接送信することもできます。

BOOL same = [@"comparison" isEqualToString:myString];
于 2013-03-31T17:44:53.437 に答える
3

のような文字列定数@"Hello"は、コンパイラによって既に割り当てられ、初期化されています。

于 2013-03-31T17:41:24.043 に答える
2

この基本的なことを覚えておいてください:-

NSString *string = ...

これはオブジェクトへのポインタであり、「オブジェクトではありません」!

したがって、ステートメント: object のアドレスを pointerNSString *string = @"Hello";に割り当てます。@"Hello"string

@"Hello"コンパイラによって定数文字列として解釈され、コンパイラ自体がメモリを割り当てます。

同様に、ステートメント

NSObject *myObject = somethingElse;

のアドレスsomethingElseを pointerに割り当てます。これは既に割り当てられ、初期化さmyObjectれているはずです。somethingElse

したがって、次のステートメントは、特定のメモリ位置でオブジェクトをNSObject *myObject = [[NSObject alloc] init];割り当てて初期化し、そのアドレスを に割り当てます。NSObjectmyObject

したがって、myObjectメモリ内のオブジェクトのアドレスが含まれます (例: 0x4324234)。

文字列リテラルの前にあるこの @ 記号は、これ"Hello"@"Hello"オブジェクトであり、アドレスを返すことをコンパイラに伝えます。

これがあなたの質問に答え、疑問を解消することを願っています。:)

于 2013-03-31T18:53:45.993 に答える