При доступе к Structure в объективном классе C возникает ошибка в XCode 4.2 - PullRequest
0 голосов
/ 16 ноября 2011

В своем приложении для 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;

В My 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];
}

В этом методе в следующей строке выдает ошибку, поскольку «переменная экземпляра защищена»

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

Эта ошибка возникает при запуске для iOS 5 с XCode 4.2, но тот же код выполняется без каких-либо ошибок для версии ниже iOS 5 в XCode 4.0.2.

Может кто-нибудь помочь мне, почему эта ошибка происходит? и ваши идеи для решения этой проблемы приветствуются!

1 Ответ

8 голосов
/ 16 ноября 2011

Это не имеет ничего общего с вашей структурой, это связано с тем, как вы определили членов вашего подкласса UIViewController.Взгляните на это:

@interface MainViewController : UIViewController
{
@public
    AudioRecording audioRecording1;

@protected // This is the default
    AudioRecording audioRecording2;

@private
    AudioRecording audioRecording3;
}
@end

Здесь этот контроллер имеет три AudioRecording члена.Однако только audiorecording1 может иметь доступ напрямую из-за пределов класса.audiorecording3 не может быть доступен для чего-либо, кроме MainViewController и audiorecording2, могут быть доступны для MainViewController и любых его подклассов.

Вы должны сделать вашу аудиозапись общедоступной, если хотите получить к ней доступнапрямую, без использования метода доступа (или свойства).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...