2016-02-12 85 views
0

我有一個類MicController,並給它一個這樣的實例變量:無法訪問在C函數的體Objective-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

對於您的班級,可能有多個對象實例,或者沒有。除非(1)將對象作爲參數傳遞,或者(2)將全局C變量設置爲實例化指針,否則AC函數無法知道在哪個對象(如果存在)中查找實例變量的感興趣的對象。後者(2)當然只對單身物件有用。

給定一個指向傳遞給C函數的對象的指針,可以使用struct dereference操作符(「 - >」)來訪問在類接口中聲明的對象中的任何實例變量。或者你可以直接傳遞感興趣的數據或指針。

+0

是否可以通過引用傳遞iVar? – ColdSteel