2012-01-12 35 views
0

我遇到了一個情況,我已經找到單獨的文件中以下兩種實現方式:目標C鏈接程序作用域

ClassA.m

@implementation ClassA 
int _x = 0; 
@end 

ClassB.m

@implementation ClassB 
int _x = 0; 
@end 

當我編譯後,連接器將聲明:

objective c dupli美食符號__x ....

我的解決方案是將兩個變量都標記爲static

那麼,Classes的所有成員變量是否都會被壓縮到符號表中,而它們的實現類名卻被預先佔用(除非將它們標記爲靜態)?我很難相信,否則我會認爲使用static將是規則,而不是例外...

回答

4

您還沒有在那裏聲明該類的實例變量;你已經聲明瞭全局變量,因此鏈接器告訴你有兩個符號叫做_x

您可能想將它們放入您的@interface中,以獲取ClassAClassB

+0

啊!我對語言細節有點新,我一直在iOS應用上盜用一段時間,只是遇到了這個問題。我記得對自己說:「嗯,他們爲什麼要複製'@interface'中的變量似乎浪費了我的時間=) – ThaDon 2012-01-12 17:26:39

+0

所以在'@interface'中定義變量的正確模式,然後初始化它們的值在'initWithNibName'中(對於UIViewController類) – ThaDon 2012-01-12 17:35:27

+2

對於iOS來說,使用最近的開發工具* *可以*實際在'@ implementation'塊中聲明實例變量;只需將它們包裝在大括號中。實現ClassA {int _x = 0;} @ end' – 2012-01-12 17:43:33

1

實例變量將在頭文件中的類的實現文件中聲明。你會希望這兩個類文件有這樣的東西:

@interface ClassA : NSObject 
{ 
    int _x; // or NSInteger _x; 
}