Objective c 财产不存在';不匹配实例变量的类型?

Objective c 财产不存在';不匹配实例变量的类型?,objective-c,arrays,pointers,properties,Objective C,Arrays,Pointers,Properties,我从中获取了一些示例代码 看起来是这样的: @interface PutController () <UITextFieldDelegate, NSStreamDelegate> ... @property (nonatomic, assign, readonly) uint8_t *buffer; ... @end @implementation PutController { uint8_t _buffer[kSendBufferSize]; } ... @end @

我从中获取了一些示例代码

看起来是这样的:

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

@implementation PutController
{
    uint8_t _buffer[kSendBufferSize];
}
...
@end
@接口控制器()
...
@属性(非原子、赋值、只读)uint8_t*缓冲区;
...
@结束
@计算机控制器的实现
{
uint8_t_缓冲区[kSendBufferSize];
}
...
@结束
但当我将其复制到我的代码时,我得到一个错误:

Type of property 'buffer' ('uint8_t *' (aka 'unsigned char *')) does not match type of instance variable '_buffer' ('unsigned char [32768]') 属性“buffer”(“uint8_t*”(又称“unsigned char*”)的类型与实例变量“u buffer”(“unsigned char[32768]”)的类型不匹配
我的代码与他们的示例完全相同,但无法编译。这是怎么回事?

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

解决此问题的最简单方法是使用第二个实例变量,该变量只是指向数组中第一个元素的指针,并将您的属性合成为该变量,如下所示:

@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实现,将指针返回到
缓冲区的第一个元素。这是你的决定,真的


它不是最优的,但它确实按照您想要的方式工作。

这里有一个设置标记格式的技巧-避免

像瘟疫一样,使用
输出,并始终为链接提供标题。这让帖子读起来更愉快:)Richard,谢谢你的回复,但我只想知道为什么样本正在编译而我的没有。两个项目中的代码相同。它们不是合成或两个单独的变量。在得到答案之前,我可能会使用你的代码。再次感谢。@user1054503编译器差异我敢打赌,您下载的示例代码是用GCC编译的(这可能是允许的),而新项目使用的是较新的clang编译器。这可能是一个bug,但您必须仔细研究语言规范才能确定。我查看了构建设置,两者都使用Apple LLVM compiler 4。2@user1054503我刚刚下载了他们的示例,果然,他们有一个自定义getter,它覆盖了@synthesis的设置。请看
-(uint8_t*)缓冲区
方法。