C數組中沒有嵌入他們的元素計數。
這就是你如何聲明一個具有未指定元素數的方法。這通常不可用:
`- (NSData*) dataTheseBytes:(const Byte*)bytes;`
// or
`- (NSData*) dataTheseBytes:(const Byte[])bytes;`
更嚴格的實現可以指定元素數量。如果你總是使用相同的尺寸,這是可以的。例如:
enum { MONByteBufferElementCount = 23 };
...
`- (NSData*) dataTheseBytes:(const Byte[MONByteBufferElementCount])bytes
{
return [NSData dataWithBytes:&bytes[0] length:MONByteBufferElementCount * sizeof(bytes[0])];
}
在這種情況下使用objc消息的問題是,編譯器可能無法確定合適的選擇,併產生錯誤或警告,如果您已聲明具有相同名稱的選擇,但使用不同參數或元素計數。因此,它的安全使用交流功能:
`NSData* DataTheseBytes(const Byte bytes[MONByteBufferElementCount]) {
return [NSData dataWithBytes:&bytes[0] length:MONByteBufferElementCount * sizeof(bytes[0])];
}
或使用更詳細的名稱:
`- (NSData*) dataWithMONByteBuffer:(const Byte[MONByteBufferElementCount])bytes
{
return [NSData dataWithBytes:&bytes[0] length:MONByteBufferElementCount * sizeof(bytes[0])];
}
在objc
,這是最常見的傳遞長度作爲參數,類似於NSData
構造你呼叫。你的程序的某些部分將能夠確定這個值(無論是NSData
,c數組還是其他)。
- (NSData*) dataTheseBytes:(const Byte*)bytes length:(NSUInteger)length
{
return [NSData dataWithBytes:bytes length:length];
}
它也經常可以看到的元素個數,像這樣:
- (NSData*) dataTheseFloats:(const float*)floats length:(NSUInteger)count
{
return [NSData dataWithBytes:floats length:count * sizeof(float)];
}
最後,當然有一些極端情況。顯而易見的是空終止的字符串:
- (NSData*) dataWithASCIIString:(const char*)chars
{
return [NSData dataWithBytes:chars length:strlen(chars)];
}
您將指針的大小返回到內存而不是內存本身。你可能需要做一些像'sizeof(* bytes)' – mydogisbox
嘗試使用strlen(bytes) – Nekto
@mydogisbox,這是正確的還是strlen正確?另外,請您將此作爲答案嗎? –