2

したがって、ObjC ではすべてがヒープに存在し、すべてがヒープへのポインターを持っていることを理解しています。私は O'Reilys の本を読んでいて、ほとんどのことを把握していますが、チュートリアル/例を実行していると、このようなものが表示されます

NSMutableArray *bar = [[[foo alloc] init] callMethod];

はの*すぐ隣にbarありますが、次のようなものがあります

- (NSString *)createDeck:(NSString *)numOfCards;

なぜでありNSString *、ではないの- (NSString)*createDeck:(NSString)*numOfCards;ですか?

物事の概念を理解する助けがあれば、感謝します。

編集:

NSUInteger *randomIndex = arc4random() % [deck count]; エラー

Where NSUInteger randomIndex = arc4random() % [deck count]; Worksは問題ありませんが、この場合にポインターを削除するとうまくいくのはなぜですか?

4

1 に答える 1

5

tl;dr

タイプはNSString *あり、それがあなたが持っている理由です

- (NSString *)createDeck:(NSString *)numOfCards;

戻り値の型と引数の型は括弧で囲みます。

最後の質問に関してはNSUInteger、命名がそうではないことを示唆しているにもかかわらず、 an はオブジェクトではありません。スタック上に存在するネイティブ型であるため、ポインタは必要ありません。

unsigned intタイプ名をcmdクリックすると、実際には(またはunsigned long、アーキテクチャによっては)のtypedefであることがわかります。


討論

C (および結果的に Objective-C) の変数は、型と識別子で構成される宣言子を使用して宣言されます。あなたの例NSString *ではタイプでbarあり、識別子です。

NSString * bar;
^^^^^^^^^^ ^^^
  type      identifier

識別子のない宣言子は抽象宣言子と呼ばれ、C では次の 3 つのケースで一般的に使用されます。

  • 鋳造

      float x = (float)2/4;
    
  • の引数sizeof()

      sizeof(int *);
    
  • 関数の引数の型を宣言する

      void foo(int *, float);
    

Objective-C では、メソッドの戻り値と引数の型にも使用されます。

- (NSString *)createDeck:(NSString *)numOfCards;

(宣言子に関する情報のほとんどはhttp://nilsou.com/blog/2013/08/21/objective-c-blocks-syntax/から適応されます)


アスタキスクの位置については、

NSString *bar;
NSString * bar;
NSString* bar;

NSString へのポインタ型の変数を宣言するすべての有効な方法ですNSString *

どちらを使用するかは個人の好みの問題ですが、最初のものが最も一般的だと思います。

于 2013-11-04T05:33:49.600 に答える