0

CからObjective-Cへの変換を理解するのに苦労しています:

次のような特定のインスタンス メソッドがあるとします。

-(void)addOwnerNamesObject:(NSString *)n; 
{
    // ownerNames defined as NSMutableSet
    [ownerNames addObject:n];
}

私はいくつかのことを理解しています...

  1. プログラムから呼び出せるインスタンスメソッドです。
  2. C では、これは何も返しません (カーリー内のコードを実行するだけです)。
  3. C では、構文がやや混乱しにくくなっています -(void)InstanceMethod(Char *nameOfArgument)

助けが必要な場所は次のとおりです。

  1. このメソッドを呼び出すとき、まだ引数を送信していますか?
  2. もしそうなら、その引数NSStringはメソッドが名前を付けるインスタンスnですか?

そして最後に...話題から外れた

方法があれば...

-(id)someMethod:(NSString *)pn
{
}
  1. (id) は何のためのものですか? それはコンパイラに、任意のタイプのオブジェクトを返すことができることを伝えますか?

初心者を助けてくれてありがとう...どうもありがとう。

4

4 に答える 4

5

まず、Objective-C の基本的なドキュメントをよく読んでください。

Objective-C では、メソッドの前に+または-記号を付けることができます。

+はクラス メソッド-用、はインスタンス メソッド用です。

次に、戻り値の型、括弧内、およびメソッド名があります。

- ( int )foo;

fooを返す、という名前のインスタンス メソッドint

同様の C 関数は次のようになります。

int foo( void );

Objective-C では、引数がある場合のメソッド名は少し特殊です。

例えば:

- ( int )foo: ( double )num;

という名前のメンバ メソッドでfoo:、 を返し、という名前の引数intを取ります。doublenum

同様の C 関数:

int foo( double num );

複数の引数を持つようになりました:

- ( int )foo: ( double )num1 bar: ( float )num2;

という名前のメンバ メソッドでfoo:bar:、 を返し、という名前の引数と という名前の引数intを取ります。doublenum1floatnum2

同様の C 関数:

int foo( double num1, float num2 );

に関する質問についてはid、単にメソッドの戻り値の型です。

idObjective-C インスタンスに使用される typedef です。
基本的に、それはvoid *です。

idどのクラスでも、Objective-C オブジェクト ポインターを表します。

于 2012-02-09T15:47:27.777 に答える
1

のさらなる議論ですでに与えられたそれらの非常に有効な答えに追加するにはid

Objective-C のオブジェクトは型がありません。つまり、基本的なレベルでは、オブジェクトと対話するために型を知る必要はありません。これは、Objective-C と、たとえば C++ との大きな違いの 1 つです。

通常、オブジェクトへのポインターはNSString *、コードを読みやすくしたり、コンパイラーに意図を示したりして、奇妙なことをした場合に適切な警告を出すことができるようにするために型付けされます。

idオブジェクトへの型のないポインタです。キャストせずに、任意のオブジェクト型を渡すことができid、任意のid値を任意のオブジェクト ポインターに割り当てることができます。

オブジェクトの 99.99% が から継承されるため、99.99% の確率でidに置き換えることができます。つまり、型のないオブジェクトの事実ではなく、継承の事実を使用して、一般的に物事を渡すことができます。ただし、 はオブジェクトとプロトコルの両方であるという点で少し特殊であり、一部のオブジェクトは実際には のサブクラスではなく、ブロックを表すクラスがすぐに思い浮かびます。これらの特殊なケースに特に関心を持つことはめったにありませんが、既知の祖先を持つオブジェクトを渡すよりも、型を示さずにオブジェクトを渡すセマンティクスを人々が好むため、規則としてよく使用されます。NSObject *NSObjectNSObjectNSObjectNSProxyid

于 2012-02-09T15:58:34.657 に答える
1

まず、メソッド名のダッシュ (-) は、これがインスタンスメソッドであることを示しています。つまり、このメッセージを送信するインスタンスが必要です。呼び出しは次のようになります。

NSString* s = @"文字列"; [someInstance addOwnersNameObject:s];

この場合、NSString インスタンスをaddOwnersNameObjectメッセージに渡します。

idはCのvoid *のようなものです。

于 2012-02-09T15:49:41.770 に答える
1

あなたはすでにあなたが話していることを知っています。

1.) このメソッドを呼び出すとき、まだ引数を送信していますか?

はい、コロンの後にあるものは何でも

複数のコロンを追加して、追加のパラメーターを渡します...

-(void)addOwnerNamesObject:(NSString *)n withSomeIntYouWantToPass:(int)value;

2.) もしそうなら、その引数はメソッドが「n」と名付けた NSString インスタンスですか?

はい

3.) (id) は何のためのものですか? それはコンパイラに、任意のタイプのオブジェクトを返すことができることを伝えていますか?

はい、NSObject または NSObject のサブクラスを返します

于 2012-02-09T15:52:01.397 に答える