在objc項目中使用常量的最佳實踐(附:常量重定義解決辦法)


之前,在在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"用灰灰的顏色顯示,也不懂得突出一下重點⋯⋯


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM