2011-11-07 38 views
8

我知道這個問題已經被問了好幾次了,但是我的是略有不同的。在重複此操作之前,請仔細閱讀。 堆棧溢出中有很多帖子說:「就我個人而言,我討厭MACROS,不要使用那個狗屎」。我讀過所有這些,而且我的情況不同。我正在嘗試使用#define宏定義軟件(iOS應用)中使用的網址。#define或const string *

我同意使用const字符串比#define宏更好。但是,在一個越來越基於REST的API世界中,接受查詢參數作爲URL的一部分,你怎麼仍然可以使用const字符串來表示一個URL的變化?

而不是http://api.myblog.com/posts?entryid=%@ ,繼REST原則將有 http://api.blog.com/posts/entries/[entryid]

在前者類型的API服務器,URL是http://api.myblog.com/posts所有條目,他們不會改變。一個常量字符串是可能的。

在後一種類型中,URL隨每個條目而變化,我使用一個擴展爲像這樣的完整URL的宏。

#define GET_ENTRY_URL(__MY_ENTRY_ID__) [NSString stringWithFormat:@"http://api.myblog.com/posts/entries/%@", __MY_ENTRY_ID__]; 

我的方法有沒有任何設計缺陷? 想知道您的意見。

謝謝。

回答

4

從編譯器的角度來看,#define是一個預處理器指令(請參閱c中的定義,http://en.wikipedia.org/wiki/C_preprocessor)。

在這種情況下,編譯器可能會在編譯代碼之前進行全文替換。

例如: - 如果你定義:

#define GET_ENTRY_URL(__MY_ENTRY_ID__) [NSString stringWithFormat:@"http://api.myblog.com/posts/entries/%@", __MY_ENTRY_ID__]; 

可能GET_ENTRY_URL的每一個事件(X)與被取代[的NSString ...,X]在你的代碼。如果Objective-C的實現遵循這一點,則有可能在我們使用宏的任何地方創建實例。

static const/variable似乎是一個更好的方法。

+0

如何傳遞的靜態常量NSString的變量? – Mugunth

+1

你知道你不能,因爲它是一個常數。如果API變得更復雜,我會像NSURL一樣構造類,可以在裏面完成網址構建。也許使用宏還不是至關重要,但是當這段代碼到達很多地方時,事情可能會再次出現錯誤。例如:將所有GET_ENTRY_URL(x)分成兩個GET_CODING_ENTRY_URL(x),GET_PERSONAL_ENTRY_URL(x)。 – alvinsj

2

我在應用程序中做的是在必要時爲路徑內的替換格式代碼定義一個基本路徑的常量,併爲每個特定路徑定義一個常量。

NSString const *APIBasePath  = @"http://api.mydomain.com"; 
NSString const *APIEntryPath  = @"/entries/%d"; 
NSString const *APIUpdateEntryPath = @"/entries/%d/update"; 

我再構建在運行時的URL爲每個API如下:

- (void)updateEntryNumber:(NSUInteger)entryNumber 
{ 
    NSString *updateEntryPath = [NSString stringWithFormat:APIUpdateEntryPath, entryNumber]; 
    NSString *APIPath = [APIBasePath stringByAppendingPathComponent:updateEntryPath]; 
    // do something 
} 
+0

我剛剛發現'stringByAppendingPathComponent:'只返回一個斜槓,即'http:/ ...',似乎這個方法用於文件路徑,而不是url。相反,我使用'stringByAppendingString:'。 :) – Kjuly

相關問題