如何定义NSArray?

时间:2012-05-11 08:54:44

标签: objective-c ios

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

#define my_definition 0;

我知道如何访问这个0值。但是NSArray里面的NSString呢?

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

4 个答案:

答案 0 :(得分:4)

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

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

除了可能数值(例如#define s)或int之外,您几乎肯定不希望NSString。 (实际上,出于各种原因,您通常会看到extern NSString * ...代替#define。)

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

也许我误解了你想要做的事情?

答案 1 :(得分:3)

如果使用#define,则定义预处理器宏。它不是一个全局变量。相反,无论你使用哪个宏,它都将被#define之后的内容所取代,然后才能编译你的代码。

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

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

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

NSString *str1 = [kMyArray objectAtIndex:0];

这将被替换为:

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

如果我的定义中有分号,我会收到编译错误。

答案 2 :(得分: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" ) );

保存整个大量的输入!

答案 3 :(得分:0)

#define MY_DEFINITION @[ @"String1", @"String2" ]

优选不含分号