ios – #define或const string *

我知道这个问题已被问过几次,但我的情况略有不同.在将其作为副本关闭之前,请完整阅读.
堆栈溢出上有很多帖子说:“就个人而言,我讨厌MACROS,不要使用那个狗屎”.我读过所有这些,我的情况有所不同.我正在尝试使用#define宏定义软件(iOS应用程序)中使用的URL.

我同意使用const字符串比#define宏更好.但是,在越来越多基于REST的API世界中,接受查询参数作为URL的一部分,您如何仍然使用const字符串来表示更改的URL?

而不是http://api.myblog.com/posts?entryid=%@
遵循REST原则的API服务器
http://api.blog.com/posts/entries/[entryid]

在前一种类型中,所有条目的URL都是http://api.myblog.com/posts,它们不会更改. const字符串是可能的.

在后一种类型中,URL随每个条目而变化,我使用宏扩展为这样的完整URL.

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

我的方法有任何设计缺陷吗?
想知道你的意见.

谢谢.

解决方法

从编译器的角度来看,#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__];

它可能会在代码中用[Nsstring …,x]替换每次出现的GET_ENTRY_URL(x).如果objective-c的实现遵循此目的,我们可能会在我们使用宏的任何地方创建实例.

static const / variable似乎是一种更好的方法.

相关文章

UITabBarController 是 iOS 中用于管理和显示选项卡界面的一...
UITableView的重用机制避免了频繁创建和销毁单元格的开销,使...
Objective-C中,类的实例变量(instance variables)和属性(...
从内存管理的角度来看,block可以作为方法的传入参数是因为b...
WKWebView 是 iOS 开发中用于显示网页内容的组件,它是在 iO...
OC中常用的多线程编程技术: 1. NSThread NSThread是Objecti...