属性与实例变量的类型不匹配?

时间:2013-05-17 16:51:35

标签: objective-c arrays pointers properties

我从Apple's SimpleFTPSample

中提取了一些示例代码

看起来像这样:

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

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

但是当我将它复制到我的代码时,我收到一个错误:

Type of property 'buffer' ('uint8_t *' (aka 'unsigned char *')) does not match type of instance variable '_buffer' ('unsigned char [32768]')

我的代码与他们的示例完全相同,但它不会编译。这是怎么回事?

1 个答案:

答案 0 :(得分:1)

不幸的是,虽然数组可以衰减到指针,但至少使用clang,它在属性中使用时不会自动衰减为只读指针。

解决这个问题的最简单方法是使用第二个实例变量,它只是指向数组中第一个元素的指针,并让你的属性合成到那个,如下所示:

@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

Alternativey,只需实现自己的getter实现,只需返回指向buffer的第一个元素的指针即可。这是你的电话,真的。

这不是最佳选择,但它确实以您想要的方式运作。