@記号はobjective-cで何を表していますか?


141

私はobjective-cを学んでいて、@記号にぶつかります。これは、さまざまなシナリオで使用されます。たとえば、文字列の先頭や、アクセサメソッドの合成などです。

Objective-cで@記号は何を意味していますか?


@interfaceと@endの前に@が使用される理由
Lalit Kumar

回答:


159

@他の言語のキーワードと競合しない方法で、Objective-C言語のキーワードを導入するために使用されますので、文字は、CまたはC ++の識別子で使用されていません。これにより、言語の「目的」の部分をCまたはC ++の部分と自由に組み合わせることができます。

したがって、ごくわずかな例外を除いて、@いくつかのObjective-Cコードで目にするときはいつでも、CまたはC ++の構造ではなく、Objective-Cの構造を調べています。

主な例外はあるidClassnil、及びNil、一般的に、彼らはまた、持っていても、言語のキーワードとして扱われているtypedefか、#defineその背後に。たとえば、コンパイラは実際idには、宣言に適用されるポインタ型変換規則と、GC書き込みバリアを生成するかどうかの決定に関して、特別に扱います。

その他の例外はinoutinoutonewaybyref、とbycopy。これらは、分散オブジェクトをより効率的にするために、メソッドパラメータと戻り値の型のストレージクラスアノテーションとして使用されます。内の属性もあります(。彼らはDOは最高にトランザクションをシリアル化する方法を決定するために見ることができ、実行時から利用できるメソッドシグネチャの一部となる)@property、宣言はcopyretainassignreadonlyreadwritenonatomicgetter、とsetter。これらは、@property宣言の属性セクション内でのみ有効です。


4
@(式)の機能について何か説明できますか?これは、xcodeで@を入力したときに表示されるポップアップで理解できない唯一の項目です。
jchnxu 14

10
@(99)は[NSNumber numberWithInteger:99]と同じです。@(YES)は[NSNumber numberWithBool:YES]と同じです。@記号は、オブジェクトを作成するためのショートカットです。
ジョジョ

7
この「答え」が実際に述べられた質問に答えないという事実によって他の誰かが混乱していますか?質問者は、「Objective-Cでの「@」の意味は何ですか」と述べています。回答者は、「Objective-Cを使用していることを意味します」と言います。私は彼がすでに同じくらい知っていたと思います...
Jon McClung

1
一種の任意; 最初のObjective-Cプリプロセッサが作成されたときに、ベースASCIIセットに含まれている必要があり、Cによってまだ使用されていない。それが理由@です。
Chris Hanson、

1
Jon McClung:レオは正解です。「深い意味」はありません。この@文字はCで使用されていなかったため、既存のCコードとの100%の互換性を維持する代替解析の便利な「エスケープハッチ」でした。
Chris Hanson

63

@記号:Objective-Cのチュートリアル、それはさまざまなキーワードの前にある理由:

@を使用すると、Objective-Cコンパイラを既存のCコンパイラに簡単にボルトで固定できるはずです。@は文字列リテラルを除くCのどのコンテキストでも有効ではないため、トークナイザー(コンパイラーの初期の簡単なステップ)を変更して、文字列定数の外で@文字を単純に探すことができます(トークナイザーは文字列リテラルを理解しますなので、これを区別する立場にあります)。@が検出されると、トークナイザは残りのコンパイラを「Objective-Cモード」にします。(Objective-Cパーサーは、Objective-Cコードの終わりを検出したときに、コンパイラーを通常のCモードに戻す責任があります)。

また、文字列リテラルの前に表示すると、Cでは「char *」ではなくNSStringになります。


24

Macrumorsから:Objective-Cチュートリアル、文字列リテラルの前:

@ "" NSStringリテラルもあります。これは基本的にNSStringの+ stringWithUTF8Stringメソッドの省略形です。

@は、C文字列にUnicodeサポートも追加します。


12
「これは基本的にNSStringの+ stringWithUTF8Stringメソッドの省略形です。」まあ、そうではありません。文字列は静的に割り当てられるため、+[NSString stringWithUTF8String:](動的に割り当てられる)とは異なり、解放および保持はそれらに影響を与えません。

16

マニュアルから:

Objective-Cフレームワークは通常、Cスタイルの文字列を使用しません。代わりに、NSStringオブジェクトとして文字列を渡します。

NSStringクラスは、任意の長さの文字列を格納するための組み込みメモリ管理、Unicodeのサポート、printfスタイルのフォーマットユーティリティなど、期待するすべての利点を持つ文字列のオブジェクトラッパーを提供します。ただし、このような文字列は一般的に使用されるため、Objective-Cは定数値からNSStringオブジェクトを作成するための簡略表記を提供します。この省略表現を使用するには、次の例に示すように、通常の二重引用符付き文字列の前に@記号を付けるだけです。

NSString *myString = @"My String\n";
NSString *anotherString = [NSString stringWithFormat:@"%d %@", 1, @"String"];

3
しかし、これは@使用される場所の1つの例にすぎません。私はこのようなコードを見ています:mapperOptions = @{ kSTMapperVolumeResolutionKey: @(volumeResolution),... NSStringとは何の関係もありません
GreenAsJade 2017年
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.