2011-03-11 97 views
4

有人可以確認您無法從同一類的C風格方法中訪問定義在Objective C @implementation塊中的實例變量嗎?編譯器引發錯誤說「XXX未申報的」,其中XXX是實例變量名訪問C風格方法中的實例變量

這裏是什麼,我解釋一個例子:

@interface FontManager : NSObject {  
       CGFontRef fontRef; 
    } 

    static int CstyleMethod() { 
     NSUInteger emSize = CGFontGetUnitsPerEm(fontRef); 
    } 

我想驗證我不能用‘fontRef’從withing「CstyleMethod」。

任何有識之士將不勝感激。

回答

0

這是正確的。你看起來雖然被混淆的方法和功能。方法僅在Objective-C存在的。你指的是什麼'C風格的方法'實際上只是一個C語言功能。

C不是面向對象的編程語言。由於C中沒有這樣的對象,因此在C中也沒有這樣的實例變量,所以fontRef實例變量在您發佈的函數中不可見,在您的程序中的任何其他C函數中也不可見。

+0

好點。我已經看到了這個論點,即C函數不應該在其他帖子中被稱爲方法,並且它是有效的。語義在試圖理解概念時很重要。我很欣賞這些反饋。 – JonnyB 2011-03-14 15:47:56

2

一個「C風格的方法」並不真正值得名字「的方法」,我把它叫做「功能」,而不是在C.

交流功能沒有self,所以不能隱式訪問ivars作爲一種方法可以。如果您將實例作爲參數傳遞給C函數,則可以按訪問結構指針中字段的相同方式訪問ivars。

0

@Anomie和@jlehr是正確的,C函數沒有FontManager對象的概念和它的當前狀態,它恰好位於同一個文件中。

但是,如果FontManager是單身,你讓fontRef屬性(或者爲它創建一個訪問),那麼這將是可能你的C類中訪問該值:

static int CstyleMethod() { 
    FontManager *fm = [FontManager sharedManager]; 
    NSUInteger emSize = CGFontGetUnitsPerEm(fm.fontRef); 
} 

底線,您可以在C函數& ObjC方法中混合搭配C和ObjC語法。但是因爲C函數沒有對self(以及對象的相關實例變量)的默認引用,所以只能引用單例的ObjC對象,存儲在全局變量中或作爲參數傳入。

+0

感謝您的回覆。我對這個話題做了更多的研究,並且理解了這個概念。我自從實現了一個靜態C變量的使用,該變量持有對我的類的實例的引用。我使用它來調用我的實例屬性方法,以便從C函數中訪問實例變量(而不是像其他人明智地糾正我的方法)。 – JonnyB 2011-03-14 15:50:54