之前,在在objc項目中使用常量中,使用c的預處理#define來設置常量。比如,可以做個頭文件,然后在需要的類文件中import,使用常量。
但這不是最佳實踐。這樣做可能是最好的方式,首先在比如叫Constants.h的頭文件中:
#import <Foundation/Foundation.h>
extern NSString * const kInitURL;
@interface Constants : NSObject {
}
@end
這里使用到extern c關鍵字,表示這個變量已經聲明,只是引用。const關鍵字表示變量是常量,不可修改。
在objc的約定里,常量也是大小寫混排的駝峰命名規則,首字母小寫,另外,第一個字母是k。
然后,在Constants.m文件中:
#import "Constants.h"
NSString * const kInitURL = @"http://marshal.easymorse.com";
@implementation Constants
@end
在這里給常量kInitURL賦值。
如何使用常量?只需在所需的m文件引入Constants頭文件,下面是使用示例:
#import "BasicDemosViewController.h"
#import "Constants.h"@implementation BasicDemosViewController
// Implement loadView to create a view hierarchy programmatically, without using a nib.
- (void)loadView {
NSLog(@"load view: %@",kInitURL);
}
使用這種方式,比通過宏預定義的優點是,可以對常量進行指針比較操作,這是#define做不到的。即:
[myURL isEqualToString:kInitURL];
上文的常量,是指可用於全局的常量。如果只是在文件內部使用,不希望之外的地方能訪問到,就需要:
#import "BasicDemosViewController.h"
#import "Constants.h"NSString * const kMyURL=@"http://marshal.easymorse.com";
@implementation BasicDemosViewController
// Implement loadView to create a view hierarchy programmatically, without using a nib.
- (void)loadView {
NSLog(@"load view: %@, %@",kInitURL,kMyURL);
}
另附:在objc項目中使用常量
objc不像java,有靜態常量。比如:
public static final RADIAS=180;
目前我的做法是,使用c的預處理#define。比如,在頭文件中:
#define MIN_VELOCITY 10
#define LOOP_COUNT 100@interface AnimationView : UIView <UIGestureRecognizerDelegate>{
在代碼中使用:
if (data.panLocation.x<MIN_X) {
data.panLocation.x=MIN_X;
}這些預定義常量,會在編譯器編譯的時候用define中定義的字符串替代。
附:Objective-C中const常量是外連接的
書中說在標准C中const定義的變量是外連接的,即如果一個編譯單元中定義了一個全局const常量,則其在其他編譯單元中是可見的,如果其他編譯單元也定義了同名const常量就會產生重復定義錯誤。這一點與C++不同,C++中const定義的變量是內連接的,即每個編譯單元定義的全局const常量是自己獨有的。
Objective-C是標准C的另一種擴展,那么我犯的錯誤也就很明顯了——當多個編譯單元都引用那個define.h文件時出現了重復定義錯。
今天來到機房一試,果然如此,只要將
const int NUMOFGHOST = 4;
改為
static const int NUMOFGHOST = 4;
就順利編譯通過了。這里的static是用來把定義的const常量標記為對外不可見的。
這里順便抱怨一句:這xcode也太不人性化了,重復定義就說重復定義嘛,非要用紅紅的字標出來"Command /Developer/Platforms/iPhoneSimulator.platform/Developer/usr/bin/gcc-4.2 failed with exit code 1",反倒是很重要的那句"ld: duplicate symbol _NUMOFGHOST in /Users/asfgasiyf/Desktop/pacMan/build/pacMan.build/Debug-iphonesimulator/pacMan.build/Objects-normal/i386/MazeView.o and /Users/asfgasiyf/Desktop/pacMan/build/pacMan.build/Debug-iphonesimulator/pacMan.build/Objects-normal/i386/pacManAppDelegate.o"用灰灰的顏色顯示,也不懂得突出一下重點⋯⋯
