0

Apple の SimpleFTPSampleからいくつかのサンプル コードを取得しました

次のようになります。

@interface PutController () <UITextFieldDelegate, NSStreamDelegate>
...
@property (nonatomic, assign, readonly) uint8_t *buffer;
...
@end

@implementation PutController
{
    uint8_t _buffer[kSendBufferSize];
}
...
@end

しかし、それを自分のコードにコピーすると、エラーが発生します:

プロパティ 'buffer' ('uint8_t *' (別名 'unsigned char *')) のタイプは、インスタンス変数 '_buffer' ('unsigned char [32768]') のタイプと一致しません

私のコードはサンプルとまったく同じですが、コンパイルできません。何が起きてる?

4

1 に答える 1

1

残念ながら、配列はポインターに減衰する可能性がありますが、少なくとも clang を使用すると、プロパティで使用されたときに読み取り専用ポインターに自動的に減衰しません。

これを修正する最も簡単な方法は、配列の最初の要素へのポインタである 2 番目のインスタンス変数を作成し、次のようにプロパティを合成することです。

@interface MyObj : NSObject

@property (readonly) uint8_t *buffer;

@end

@implementation MyObj {
    uint8_t *_bufferPtr;
    uint8_t _buffer[1024];
}

@synthesize buffer = _bufferPtr;

-(id) init {
    if (self = [super init]) {
        _bufferPtr = &_buffer[0];
    }

    return self;
}

@end

または、独自の getter 実装を実装して、 の最初の要素へのポインターを返すだけですbuffer。それは本当にあなたの呼び出しです。

最適ではありませんが、希望どおりに動作するようです。

于 2013-05-17T17:08:35.620 に答える