3

我对objective-c还是新手,我需要一些关于变量声明的见解。我的程序的重点是阅读分几NSData部分传递的消息。每当程序接收到 aNSData时,它就会将它作为无符号字符添加到已经部分完成的消息中。这意味着消息缓冲区必须定义为 的属性viewController

@property unsigned char* receiveBuf;
@property int bufSize;

此时程序有一个NSData名为 data 的对象,并像这样对待它:

int len = [data length];
unsigned char* tempBytebuf = (unsigned char*)[data bytes];
for(int i = 0; i < len; i++){                           //read all bytes
    if (tempBytebuf[i] == 0x7E) {                       //this char means start of package
        _bufSize = 0;
    }
    else if (tempBytebuf[i] == 0x7D) {                  //this char means end of package
        [self readMsgByte:_receiveBuf :_bufSize];
    }
    else {                                              //any other char is to be put in the message
        _receiveBuf[_bufSize++] = tempBytebuf[i];       //Error happens here
    }
}

如果我这样继续,将导致错误 EXC_BAD_ACCESS。如果我可以告诉程序为缓冲区保留空间,它将解决问题:

@property unsigned char receiveBuf[256];

但似乎我不能用@properties. ViewDidLoad()有没有办法在例如或其他地方分配该空间?谢谢你的支持!

编辑1:

看来我刚刚在我以前的一些代码中找到了解决方案,我应该在实现中声明我的 char 表。

@implementation ViewController
{
     unsigned char msgBuf[256];
}

@property不过,如果有人能告诉我变量声明的和空间之间的真正区别,implementation那将阻止我犯类似这样的其他错误。非常感谢。

4

2 回答 2

2

如果您需要将其声明为unsigned char*,那么 malloc/calloc/realloc/free 是您的朋友。

实际上,制作该 ivarNSMutableData并使用类似的 API-appendBytes:length:应该是所有必要的。

于 2013-07-08T10:35:51.807 回答
1

使用 NSMutableData:

@property (strong) NSMutableData *recievedData;

它为任意一块内存提供了一个很好的包装器,它的内容和长度可以随时改变——最重要的是它完全适合于 Objective-C 运行时和内存管理。

只需像这样创建一个空(0 长度)数据对象:

self.receivedData = [[NSMutableData alloc] init];

然后您可以随时执行以下操作:

[self.recivedData appendBytes:bytes length:length];

或者:

[self.recievedBytes appendData:anotherNSDataObj];

从那里您可以使用 getBytes: 方法读取它。

通过声明较低级别的实例变量,还有其他方法可以做到这一点,但 @property 是现代方法。旧样式的实例变量能够满足您的尝试,但我们正在远离它们,它可能很快就会被弃用。

于 2013-07-08T10:43:10.810 回答