@在Objective-C 2.0中合成一个C数组结构

ELL*_*BLE 6 c macos cocoa objective-c

我正在尝试在Mac OS X API(音频队列服务)中遵循C++接口的教程,但是在Cocoa(实际上只是基础)应用程序(实际上只是一个'工具').它有一个如下所示的结构:

static const int kNumberBuffers = 3;                              // 1
struct AQPlayerState {
    AudioStreamBasicDescription   mDataFormat;                    // 2
    AudioQueueRef                 mQueue;                         // 3
    AudioQueueBufferRef           mBuffers[kNumberBuffers];       // 4
    AudioFileID                   mAudioFile;                     // 5
    UInt32                        bufferByteSize;                 // 6
    SInt64                        mCurrentPacket;                 // 7
    UInt32                        mNumPacketsToRead;              // 8
    AudioStreamPacketDescription  *mPacketDescs;                  // 9
    bool                          mIsRunning;                     // 10
};
Run Code Online (Sandbox Code Playgroud)

我将第4项转换为Objective-C时遇到了很多麻烦,因为我无法弄清楚如何@synthesize使用C数组.具体来说,这是我到目前为止:

PlayerState.h

#import <Foundation/Foundation.h>
#import <AudioToolbox/AudioQueue.h>

@interface PlayerState : NSObject {
  AudioStreamBasicDescription   dataFormat;
  AudioQueueRef                 queue;
  AudioQueueBufferRef           _buffers[3];
  int                           audioFile; // make this an actual type?
  UInt32                        bufferByteSize;
  SInt64                        currentPacket;
  UInt32                        numPacketsToRead;
  AudioStreamPacketDescription* packetDescs;
  bool                          isRunning;
}

@property(assign) AudioStreamBasicDescription   dataFormat;
@property(assign) AudioQueueRef                 queue;
@property(assign) AudioQueueBufferRef           buffers;
@property(assign) int                           audioFile;
@property(assign) UInt32                        bufferByteSize;
@property(assign) SInt64                        currentPacket;
@property(assign) UInt32                        numPacketsToRead;
@property(assign) AudioStreamPacketDescription* packetDescs;
@property(assign) bool                          isRunning;

@end
Run Code Online (Sandbox Code Playgroud)

PlayerState.m

#import "PlayerState.h"

@implementation PlayerState

@synthesize dataFormat;
@synthesize queue;
@synthesize buffers;
@synthesize audioFile;
@synthesize bufferByteSize;
@synthesize currentPacket;
@synthesize numPacketsToRead;
@synthesize packetDescs;
@synthesize isRunning;

@end
Run Code Online (Sandbox Code Playgroud)

@synthesize buffers 无法编译如下:"错误:合成属性'缓冲区'必须与兼容的ivar命名相同或必须明确命名为ivar"

这显然是因为相应的ivar被命名_buffers而不是buffers- 但这是必要的,因为我不能将属性定义为数组(我可以吗?@property(assign) *AudioQueueBufferRef buffers是语法错误)

我可以做什么来将ivar定义为AudioQueueBufferRef结构数组,或者合成属性以使其引用_buffers数组?

e.J*_*mes 2

编辑: Peter Hosey指出 C 中的数组与指针不同(详细信息请参阅本文档)。这可以解释您所看到的错误,并且会使我发布的代码错误。

gs在他的回答中链接到的另一个问题提出了一种解决方法,我在这个问题的上下文中复制了该解决方法:

// PlayerState.h:
@interface PlayerState : NSObject 
{
    AudioQueueBufferRef           _buffers[3];
}

@property(readonly) AudioQueueBufferRef * buffers;
Run Code Online (Sandbox Code Playgroud)


// PlayerState.m:
@implementation PlayerState

@dynamic buffers;
- (AudioQueueBufferRef *)buffers { return _buffers; }

@end
Run Code Online (Sandbox Code Playgroud)

这将允许您buffers像访问对象数组的指针一样进行访问AuidoQueueBufferRef

  • eJames:不完全是。数组与指针不同。(这是我的指针教程中的两个已知错误之一,我没有时间修复。)我曾经有一个指向解释所有差异的页面的链接,但找不到它。这是替代品:http://www.lysator.liu.se/c/c-faq/c-2.html (2认同)