在目标C类中访问结构会在XCode 4.2上产生错误

Sha*_*a G 0 iphone objective-c xcode4 ios5

在我的iPhone应用程序中,我正在使用结构并从Objective C UIViewController类访问它,在我的一个AudioInput.h文件中,我有以下内容:

   typedef struct
    {
        AudioStreamBasicDescription format;
        AudioQueueRef queue;
        AudioQueueBufferRef buffers[ NUM_AUDIO_BUFFERS ];
        SampleBuffer samples;
        bool running;
        bool done;

        UInt32 playPos;

    }   AudioRecording;
Run Code Online (Sandbox Code Playgroud)

在我的ViewController MainViewController.m中我实现了AudioInputCallback()如下:

static void AudioInputCallback(
    void *userData,
    AudioQueueRef queue,
    AudioQueueBufferRef buffer,
    const AudioTimeStamp *startTime,
    UInt32 numPackets,
    const AudioStreamPacketDescription *packetDescriptions
)
{
    // TRACE( "AudioInputCallback\n" );

    MainViewController *controller = (MainViewController *) userData;
    AudioRecording *audioRecording = & controller->audioRecording;

    if( audioRecording->done )
    {
        TRACE( "AudioInputCallback: done\n" );
        return;
    }
    if( numPackets == 0 && audioRecording->format.mBytesPerPacket > 0 )
    {
        numPackets = buffer->mAudioDataByteSize / audioRecording->format.mBytesPerPacket;
    }
    if( numPackets == 0 )
    {
        TRACE( "not packets received\n" );
        return;
    }

    const SInt16 *inSamples = (const SInt16 *) buffer->mAudioData;
    const UInt32 remain = audioRecording->samples.size - audioRecording->samples.count;
    if( numPackets > remain )
    {
        numPackets = remain;
    }
    if( numPackets == 0 )
    {
        TRACE( "AudioInputCallback: no packets received\n" );
    }
    if( numPackets > 0 )
    {
        /*  Save samples.  */
        if( audioRecording->samples.data )
        {
            UInt16 *in = (UInt16 *) inSamples;
            UInt16 *out = (UInt16 *)( audioRecording->samples.data + audioRecording->samples.count );
            for( UInt32 i = 0; i < numPackets; ++i )
            {
                *out ++ = ntohs( *in++ );
            }
        }
        audioRecording->samples.count += numPackets;
    }

    if( audioRecording->samples.count < audioRecording->samples.size )
    {
        OSStatus result = AudioQueueEnqueueBuffer( queue, buffer, 0, NULL );
        if( result )
        {
            TRACE( "AudioQueueEnqueueBuffer(..) failed with status %d\n", result );
        }
    }
    else
    {
        TRACE( "AudioInputCallback: enough material, stop recording\n" );
        audioRecording->done = true;
        AudioQueueStop( audioRecording->queue, true );
    }

    [controller performSelectorOnMainThread:@selector(bufferFilled) withObject:nil waitUntilDone:NO];
}
Run Code Online (Sandbox Code Playgroud)

在下面这行的方法中它给出了"实例变量受保护"的错误

MainViewController *controller = (MainViewController *) userData;
AudioRecording *audioRecording = & controller->audioRecording;
Run Code Online (Sandbox Code Playgroud)

使用XCode 4.2运行iOS 5时会出现此错误,但在XCode 4.0.2中运行相同的代码时没有为iOS 5下面的任何错误构建.

谁能帮助我为什么会出现这个错误?并且欢迎您提出解决此问题的想法!

dea*_*rne 8

它与您的结构无关,它与您如何定义UIViewController子类的成员有关.看看这个 :

@interface MainViewController : UIViewController
{
@public
    AudioRecording audioRecording1;

@protected // This is the default
    AudioRecording audioRecording2;

@private
    AudioRecording audioRecording3;
}
@end
Run Code Online (Sandbox Code Playgroud)

这里,这个控制器有三个AudioRecording成员.但是,只能audiorecording1直接从课外访问.audiorecording3不能被除以外的任何东西访问,MainViewController并且audiorecording2可以被MainViewController它的任何子类访问.

如果您想直接访问它而不通过访问方法(或属性),则需要将您的audiorecording公开.