小男孩‘自慰网亚洲一区二区,亚洲一级在线播放毛片,亚洲中文字幕av每天更新,黄aⅴ永久免费无码,91成人午夜在线精品,色网站免费在线观看,亚洲欧洲wwwww在线观看

分享

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

 軟件團隊頭目 2013-01-16

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

之前,在在objc項目中使用常量中,使用c的預(yù)處理#define來設(shè)置常量。比如,可以做個頭文件,然后在需要的類文件中import,使用常量。

但這不是最佳實踐。這樣做可能是最好的方式,首先在比如叫Constants.h的頭文件中:

#import <Foundation/Foundation.h>

extern NSString * const kInitURL;

@interface Constants : NSObject {

}

@end

這里使用到extern c關(guān)鍵字,表示這個變量已經(jīng)聲明,只是引用。const關(guān)鍵字表示變量是常量,不可修改。

在objc的約定里,常量也是大小寫混排的駝峰命名規(guī)則,首字母小寫,另外,第一個字母是k。

然后,在Constants.m文件中:

#import "Constants.h"

NSString * const kInitURL = @"http://marshal.";

@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); 
}

使用這種方式,比通過宏預(yù)定義的優(yōu)點是,可以對常量進行指針比較操作,這是#define做不到的。即:


       [myURL isEqualToString:kInitURL];

 

上文的常量,是指可用于全局的常量。如果只是在文件內(nèi)部使用,不希望之外的地方能訪問到,就需要:

#import "BasicDemosViewController.h" 
#import "Constants.h"

NSString * const kMyURL=@"http://marshal.";

@implementation BasicDemosViewController

// Implement loadView to create a view hierarchy programmatically, without using a nib. 
- (void)loadView { 
    NSLog(@"load view: %@, %@",kInitURL,kMyURL); 
}

 

 

另附:在objc項目中使用常量

objc不像java,有靜態(tài)常量。比如:

public static final RADIAS=180;

目前我的做法是,使用c的預(yù)處理#define。比如,在頭文件中:

#define MIN_VELOCITY 10 
#define LOOP_COUNT 100

@interface AnimationView : UIView <UIGestureRecognizerDelegate>{

在代碼中使用:

if (data.panLocation.x<MIN_X) { 
    data.panLocation.x=MIN_X; 
}

這些預(yù)定義常量,會在編譯器編譯的時候用define中定義的字符串替代。

 

附:Objective-C中const常量是外連接的

書中說在標準C中const定義的變量是外連接的,即如果一個編譯單元中定義了一個全局const常量,則其在其他編譯單元中是可見的,如果其他編譯單元也定義了同名const常量就會產(chǎn)生重復(fù)定義錯誤。這一點與C++不同,C++中const定義的變量是內(nèi)連接的,即每個編譯單元定義的全局const常量是自己獨有的。

    Objective-C是標準C的另一種擴展,那么我犯的錯誤也就很明顯了——當多個編譯單元都引用那個define.h文件時出現(xiàn)了重復(fù)定義錯。

    今天來到機房一試,果然如此,只要將

    const int NUMOFGHOST = 4;

改為

    static const int NUMOFGHOST = 4;

就順利編譯通過了。這里的static是用來把定義的const常量標記為對外不可見的。

    這里順便抱怨一句:這xcode也太不人性化了,重復(fù)定義就說重復(fù)定義嘛,非要用紅紅的字標出來"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"用灰灰的顏色顯示,也不懂得突出一下重點??

分類: objective-c

    本站是提供個人知識管理的網(wǎng)絡(luò)存儲空間,所有內(nèi)容均由用戶發(fā)布,不代表本站觀點。請注意甄別內(nèi)容中的聯(lián)系方式、誘導(dǎo)購買等信息,謹防詐騙。如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請點擊一鍵舉報。
    轉(zhuǎn)藏 分享 獻花(0

    0條評論

    發(fā)表

    請遵守用戶 評論公約

    類似文章 更多