1

カスタム構造体型の C 配列のプロパティを宣言する必要があります。

プロパティ宣言に関して、このC配列で何をすべきかを誰かが説明できますか? プロパティ宣言をまったく使用すべきではありませんか?

配列内のメモリを ingしようmemset()としましたが、コンパイル エラーで惨めに失敗しました。誰かもそれを説明できますか?

4

3 に答える 3

2

この回答は、問題を実際に解決するものではなく、アプローチが機能しなかった理由を説明するだけです。

C では、関数から配列型を返すことはできません。これは単に言語の制限です (意図的かどうかはわかりません)。さらに、Objective-C では、メソッドから配列型を返すことはできません。これは、コンパイラがsynthesize配列型を返すメソッドを処理できないため、配列型をプロパティとして使用できないことも意味します。

C 配列は、式で使用されると自動的にポインター型に変換されるため、@Graham のアドバイスに従い、代わりにポインターを使用できます。このアプローチの欠点は、配列の最後を誤って読み取らないように、配列内の要素数を正確に把握する必要があることです。NSArray要素の数が固定されており、コンパイル時にわかっている場合は、おそらくこれが適切な方法です (何らかの理由で回避したい場合)。

実際にどのように使用したかを確認せずにコンパイルに失敗した理由を答えることは困難memsetですが、一般的に言えば、次のように使用できます。

MyStruct someStructs[10];

memset(someStructs, 0, sizeof someStructs);

あるいは、配列が含まれている場合でも、関数/メソッドから構造体を返すことができます。理論的には、 の配列を含む構造体を作成し、MyStructこの新しい構造体型をプロパティ型として使用できます。実際には、これは複雑なレイヤーを追加するだけなので、良い考えではありません。

于 2010-10-25T08:19:25.017 に答える
1

あなたがこれを持っている場合:

@interface MyClass
{
    struct MyStruct foo[5];
}
@end

読み取り/書き込みプロパティをまったく持つことはできません。読み取り専用プロパティを宣言できます

@property (readonly, assign) struct MyStruct* fooProperty;

これにより、配列へのポインターが得られます。ただし、コードの残りの部分に MyClass の構造への内部アクセスを与えるため、これはおそらく悪いことです。手動で行う必要があるKVC インデックス付きアクセサーを実装することをお勧めします。

于 2010-10-25T08:44:35.130 に答える
0

確かに、配列をプロパティとして扱うことができます。構造体を保持できないため、「割り当て」動作が発生します。基本的に、配列のメモリ割り当てについては依然として完全に責任があります。

別のオプションは、構造体をオブジェクトに置き換えることです。次に、プロパティ機構でより自然に動作し、NSArray などの Foundation コレクション クラスを開きます。

于 2010-10-25T07:05:50.723 に答える