2016-02-12 5 views
0

У меня есть класс MicController и дать ему переменную экземпляра так:Не удается получить доступ к переменным экземпляра класса Objective-C в теле функции C

@implementation MicController { 
    AudioStreamBasicDescription streamFormat; 
} 

Я инициализировать объект и попытаться создать аудиосистему с помощью чтобы переменная ASBD отслеживала формат потока.

- (instancetype)init { 
    if (self = [super init]) { 
     [self setup]; 
    } 
    return self; 
} 

- (void)setup { 
    CreateInputUnit(); 
} 

Однако внутри CreateInputUnit() я, кажется, не имеют доступа к переменной.

void CreateInputUnit() { 
stream... // nothing 
} 

Отсутствие автозавершения, отсутствие синтаксиса высокого освещения, без компиляции. Я что-то упускаю?

+4

У вас есть доступ только к переменным экземпляра в методах экземпляра. Как могла бы ваша функция C узнать, к какому экземпляру, к которому он должен обращаться, например? Он не может знать по волшебству. –

+0

Это имеет смысл. Я предположил, что что-либо в блоке '@ implementation' будет находиться в определенной области, где переменные живы. Но теперь я вижу, что я должен передавать переменные в качестве параметров для их использования? Если это так, они будут копиями. Есть ли способ, которым люди обычно обращаются к переменным экземпляра в c-функциях? –

+3

C не имеет классов или переменных экземпляра. Чтобы сделать что-то сопоставимое в C, вы обычно передавали указатель на структуру и получали доступ к этим элементам структуры. Под капотом это в значительной степени то, что происходит с методом экземпляра, язык просто скрывает его от вас. –

ответ

0

Для вашего класса возможно иметь несколько экземпляров объектов или нет. Функция AC не может знать, какой объект (если он существует), в котором нужно искать переменные экземпляра, если вы (1) не передаете объект в качестве параметра или (2) не установите глобальную переменную C указателю на экземпляр объекта интереса. Последнее (2) полезно, конечно, только для одноэлементных объектов.

Учитывая указатель на объект, переданный функции C, вы можете использовать оператор структурной разметки ("->") для доступа к любой переменной экземпляра в объекте, объявленном в интерфейсе класса. Или вы можете просто передать данные или указатели, представляющие интерес, напрямую.

+0

Можно ли передать iVar также по ссылке? – ColdSteel