3

我想在其中添加带有 NSString 值的 NSArray 。我几乎可以肯定我可以使用#define它,但我不明白如何访问和初始化声明的变量。例如我有:

#define my_definition 0;

而且我知道如何访问这个 0 值。但是 NSArray 中的 NSString 怎么样?

我有一个定义.h 文件。在那里,我可以从我的任何班级访问。

4

4 回答 4

5

哇...你想在这里做什么?

#define是一个预处理器宏。预处理器对 Objective-C (或者 C ……它只是一个美化的文本替换引擎)一无所知,而 Objective-C 对预处理器一无所知。

#define除了数值(例如ints)或a 之外,您几乎肯定不想要 a NSString。(实际上,由于各种原因,您通常也会看到extern NSString * ...代替。)#define

如果您需要访问NSArray对象中的特定内容,您可以创建一个您填充的 ​​ivar-init等。如果其他类需要访问该数组,请将其设为@property或仅声明一个(公共)方法。

也许我误解了你想要做什么?

于 2012-05-11T09:02:48.777 回答
4

如果你使用#define,你定义了一个预处理器宏。它不是一个全局变量。相反,无论您在哪里使用该宏,它都会被#define 之后的内容替换,然后才会编译您的代码。

话虽如此,您可以像在其他地方一样简单地定义一个 NSArray:

#define kMyArray [NSArray arrayWithObjects:@"MyString1", @"MyString2", nil]

请注意,我没有以分号结束这一行。想象一下,如果我现在在代码中的某个地方写下:

NSString *str1 = [kMyArray objectAtIndex:0];

这将被替换为:

NSString *str1 = [[NSArray arrayWithObjects:@"MyString1", @"MyString2", nil] objectAtIndex:0];

如果我的定义中有分号,我会得到一个编译器错误。

于 2012-05-11T09:00:32.153 回答
2

几个月前我遇到了别人的代码,我根据自己的目的进行了调整,主要是为了节省自己的大量打字时间。我提前向原作者道歉,我很想在应得的地方给予赞扬,但我翻遍了我的硬盘,找不到原始样本或他或她的名字。如果我确实遇到了原始来源,我会用原作者的名字修改这篇文章。

无论如何,基本思想是使用 $ 字符作为宏前缀字符,然后采用可变参数。是的,gcc 和 Apple 的 LLVM 编译器都支持这一点。我已经疯了,根据几个例子转换了几乎所有的核心类型(数组、字符串、日期、字典等),但这里有一些想法可以帮助你:

#define $string( _format, _args... )        ( [NSString stringWithFormat: ( _format ), _args] )
#define $stringUTF8( _format, _args... )    ( [[NSString stringWithFormat: ( _format ), _args] UTF8String] )

// shorthand container creation (NSArray, NSMutableArray)
#define $array( _objs... )                  ( { id objs[] = { _objs }; [NSArray arrayWithObjects: objs count: sizeof(objs) / sizeof(id)]; } )
#define $arrayM( _objs... )             ( { id objs[] = { _objs }; [NSMutableArray arrayWithObjects: objs count: sizeof(objs) / sizeof(id)]; } )

这可以让你做一些整洁的事情,如下所示:

NSArray *           array;

array = $array( @"foo", @"bar", $string( @"This is a %@ string", @"formatted" ) );

节省大量打字

于 2012-05-11T09:27:12.013 回答
0
#define MY_DEFINITION @[ @"String1", @"String2" ]

最好不要分号

于 2012-05-11T08:57:34.457 回答