7

C スタイルの構造体を含む Objective-C クラスがあります。このオブジェクト メンバー (別名プロパティ) へのポインターを渡す C 関数を呼び出す必要があります。私の人生では、この C 構造体のアドレスを取得する方法がわかりません。従来の&演算子を使用してアドレスを取得すると、LValue コンパイラ エラーが発生します。

typedef struct _myStruct
{
   int aNumber;
}MyStruct, *pMyStruct;

@interface MyClass : NSObject {
    MyStruct mystruct;
}
@property (readwrite) MyStruct myStruct;
@end

次のコードでは、コンパイラ エラーが発生します。

MyClass* myClass = [[MyClass alloc] init];

MyStruct* p = &(myClass.myStruct);

オブジェクトのmyStructメンバーへのポインターを取得するにはどうすればよいですか?myClass

4

4 に答える 4

4

多くの場合、Objective-C アプリは構造体や類似の型へのポインターを使用する C/C++ API と連携する必要があるため、元の投稿が求めていることを行うにはかなりの理由がありますが、Cocoa アプリでは、多くの場合、そのようなデータを、データ管理、配列や辞書での収集などのために Objective-C クラスに保存します。

この質問はしばらく前からありましたが、明確な答えはわかりません。つまり、プロパティをサポートしているデータのアドレスを返すメソッドを使用できますが、そのメソッドでは「self」またはそれを使用しないでください。アクセサーを通過しますが、まだ機能しません。

- (const MyStruct*) getMyStructPtr
{
    return &mystruct;
}

OP から宣言されたプロパティを使用していますが、それを として参照していないことに注意してくださいself.mystruct。これにより、コンパイラ エラーが発生します (合成された getter メソッドを呼び出すため)。

于 2015-06-10T09:09:07.870 に答える
2

質問自体は、少なくとも用語の理解の欠如を示しています。

プロパティは、オブジェクトによって公開される2つ(または読み取り専用の場合は1つ)のメソッド、つまりこの場合はgetterメソッドとsetterメソッドで構成されるインターフェイスです。

- (MyStruct) myStruct;
- (void) setMyStruct: (MyStruct) newMyStruct;

「物件の住所を取得する」と言っても意味がありません。

インスタンス変数(ivar)のアドレスを取得できます。この場合、mystructという名前のivarがあり&mystruct、MyClassのメソッドでそのアドレスを取得できます。(デフォルトで)マークされているので@protected、を使用してサブクラスでそのアドレスを取得できます&self->mystruct。マークを付けると@public、を使用してそのアドレスを取得できます&myobj->mystruct。これはひどい考えであり、あなたは本当にこれを再考する必要がありますが、あなたはそれを行うことができます。

短期間の目的でivarのアドレスが必要な場合(たとえば、MyStructが大きい場合)はこれを行うことができますが、これは非常に珍しいことであり、次のような明示的に名前が付けられたメソッドを作成することをお勧めします。

- (MyStruct*) getAddressForSettingMyStruct;

読み取り専用の場合は、constMyStruct*を使用することをお勧めします。

于 2009-07-09T12:56:05.823 に答える
2

MyStruct mystructでプライベートです。実際の構造ではなく、生成されたアクセサーメソッドのみを参照しているMyClassと思います。myClass.myStruct

インスタンス変数(この場合構造体)はprivateなので外部からアクセスできないと思います。

于 2009-07-09T06:12:06.877 に答える
2

myStruct インスタンス変数へのポインターを取得するには、そのインスタンス変数へのポインターを返すメソッドを作成する必要があります。

- (void)getMyStructPointer:(MyStruct **)outStruct {
    *outstruct = &myStruct;
}

しかし、これは良い考えだとは思いません。他のオブジェクトは、そのオブジェクトの ivar をその下から変更するべきではありません。これは、値によって返される構造体のコピーでは実行できない、構造体へのポインターで実行できる唯一のことです。

于 2009-07-09T06:24:43.077 に答える