2011-03-30 45 views
0

我有一个很大的常量(一个NSString值为10^6)。由于它的大小,我想在源文件的末尾声明它(所以我不必在每次编辑代码时都滚动它)。也因为它的大小,我希望它是一个常量,所以我可以在编译时加载它而不是运行时。另外,因为我不希望它可以被外部用户访问,所以我不想在头文件中声明它为extern。目标C中的大隐藏常量

我把它声明为一个常量,在实现文件中使用下面的代码,但它给了我一个“使用未声明的标识符'hugeConstantString'”,如果我将它移过实现的@end(出于显而易见的原因)。

NSString *const hugeConstantString = @"a_whooooooole_lotta_characters";

我检查了这一点:Constants in Objective-C但它并没有告诉我什么我不知道的。也许我的大脑被炸了,但是:有没有什么方法可以在我的实现后定义这个巨大的常量,并且仍然可以访问?或者,如果我在另一个头文件中声明并导入它,那么其他人是否可以访问它?

谢谢!

回答

1

我将保存你为什么要这样做的对话,只是为你发布一个简单的解决方案。感谢汤米在这里的评论是一个更简单的版本。

#import "LargeStringTest.h" 


@implementation LargeStringTest 

//Declare the string 
static NSString *hugeConstantString; 

- (id)init { 
    self = [super init]; 
    if (self) { 
     NSLog(@"Large String %@", hugeConstantString); 
    } 
    return self; 
} 

//Place all other code here 

//Assign the string 
static NSString *hugeConstantString = @"a_whooooooole_lotta_characters"; 

@end 
+0

我正在发布类似的东西;注意原始海报:只要声明(在发布的示例中位于 - (id)init之上)对于那些代码段是可见的,那么hugeConstantString__的实际定义可以放在任何你喜欢的地方,甚至超过@end需要它。 – Tommy 2011-03-30 17:09:02

+0

我给了Moshe +1,因为这是最干净的方式。我只是提供了一个类似于原始问题的选项。尽管如此,它绝对是一种选择。 – Joe 2011-03-30 17:12:15

+0

@Joe - 感谢upvote!这是做到这一点的一种方式,但是我想知道整个包装类的作用是什么,只需一行'#define'就足够了。 – Moshe 2011-03-30 17:14:08

2

我不确定这么大的字符串是一个好主意,但如果你打算使用它,我建议把它放在它自己的头文件中。

MyLongStringConstant.h

#define kLongString @"..." 

MyClass.h

.... 
#import "MyLongStringConstant.h" 
... 
//Do something with kLongString 
... 

如果你想有它在你的应用程序的每个文件访问,输入标题您的应用程序内myApp_Prefix.pch文件,它被导入到每个文件中。

+0

虽然这是一个好主意,但这并不能直接回应海报的“不想让外部用户可以访问该字符串”的愿望。尽管在Objective-C这样的动态运行环境中实际上很少有人实际无法访问,但我想根据这些思路进行思考并不是那么有帮助,并且在某种程度上你是无视这个愿望的。 – Tommy 2011-03-30 17:28:59

+1

我怀疑有人使用完全编译的应用程序作为静态库。这不应该是一个问题。 – Moshe 2011-03-30 17:34:55

+1

@Tommy我想你可能是对的。只要阅读[这篇小文章](http://www.mcafee.com/us/resources/white-papers/foundstone/wp-pen-testing-iphone-ipad-apps.pdf),似乎有人知道什么无论我如何尝试将其私有化,他们都可以很容易地弄清楚如何访问它。无赖。 – CrawfishJones 2011-03-30 19:23:21