Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/wordpress/13.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Objective c 目标C中的大隐藏常数_Objective C_Ios4_Nsstring_Constants - Fatal编程技术网

Objective c 目标C中的大隐藏常数

Objective c 目标C中的大隐藏常数,objective-c,ios4,nsstring,constants,Objective C,Ios4,Nsstring,Constants,我有一个大常量(一个有10^6个值的NSString)。由于它的大小,我想在源文件的末尾声明它(所以我不必每次编辑代码时都滚动它)。由于它的大小,我希望它是一个常量,这样我就可以在编译时而不是运行时加载它。另外,因为我不希望外部用户可以访问它,所以我不希望在头文件中将它声明为extern 我在实现文件中使用下面的代码将其声明为常量,但是如果我将其移动到实现的@end之后(出于明显的原因),它会给我一个“使用未声明的标识符'hugeConstantString'” NSString*const h

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

我在实现文件中使用下面的代码将其声明为常量,但是如果我将其移动到实现的@end之后(出于明显的原因),它会给我一个“使用未声明的标识符'hugeConstantString'”

NSString*const hugeConstantString=@“a_whoooooole_lotta_characters”

我已经查过了,但它没有告诉我任何我不知道的事情。也许我的大脑已经崩溃了,但是:有没有办法在实现之后定义这个巨大的常数,并且仍然可以访问它?或者,如果我在另一个头文件中声明它并导入它,其他人会访问它吗


谢谢

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

MyLongStringConstant.h

#define kLongString @"..."
....
#import "MyLongStringConstant.h"
...
//Do something with kLongString
...
MyClass.h

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

如果您想在应用程序的每个文件中都可以访问它,请将头导入应用程序
myApp_Prefix.pch
文件中,该文件会导入到每个文件中。

我不确定这么大的字符串是否是一个好主意,但如果您打算使用它,我建议将其放入自己的头文件中

MyLongStringConstant.h

#define kLongString @"..."
....
#import "MyLongStringConstant.h"
...
//Do something with kLongString
...
MyClass.h

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

如果您想在应用程序的每个文件中都可以访问它,请导入应用程序
myApp_Prefix.pch
文件中的标题,该标题会导入到每个文件中。

我将保存您为什么要这样做的对话,并为您发布一个简单的解决方案。多亏了Tommy,这里的评论是一个更简单的版本

#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

我将保留你为什么要这样做的对话,并为你发布一个简单的解决方案。多亏了Tommy,这里的评论是一个更简单的版本

#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


我正在发布类似的东西;原始海报注意:hugeConstantString_uuu的实际定义可以放在任何你喜欢的地方,甚至可以放在@end之后,只要声明(在发布的示例中位于-(id)init之上)对需要它的代码部分可见。我给了Moshe+1,因为这是最干净的方法。我只是提供了一个与原始问题类似的选项。不过这绝对是一个选择。@Joe-谢谢你的投票!这是一种方法,但我想知道当一行
#define
就足够了时,整个包装类的意义何在。我并不打算将其作为包装类。我打算在我的示例中表示他计划在中使用大字符串的唯一类。有了#defines,编译器所做的就是用大字符串替换define名称,但由于编译器优化了字符串文本,这不是一个坏的选择。仔细研究后,我实际上要发布一个更简单的东西,大意是可以在一个地方声明字符串(就像init上面所做的那样)然后在其他地方定义它。因此,原始海报可以在源文件的顶部声明它,然后在底部定义它。我不得不承认,我没有考虑过包装类,我正在发布一个类似的东西;原始海报注意:hugeConstantString_uuu的实际定义可以放在任何你喜欢的地方,甚至可以放在@end之后,只要声明(在发布的示例中位于-(id)init之上)对需要它的代码部分可见。我给了Moshe+1,因为这是最干净的方法。我只是提供了一个与原始问题类似的选项。不过这绝对是一个选择。@Joe-谢谢你的投票!这是一种方法,但我想知道当一行
#define
就足够了时,整个包装类的意义何在。我并不打算将其作为包装类。我打算在我的示例中表示他计划在中使用大字符串的唯一类。有了#defines,编译器所做的就是用大字符串替换define名称,但由于编译器优化了字符串文本,这不是一个坏的选择。仔细研究后,我实际上要发布一个更简单的东西,大意是可以在一个地方声明字符串(就像init上面所做的那样)然后在其他地方定义它。因此,原始海报可以在源文件的顶部声明它,然后在底部定义它。我必须承认,我没有考虑过包装类。虽然这是一个好主意,但这并不能直接回答发帖人的愿望,即他“不希望外部用户可以访问(字符串)”。虽然在Objective-C这样的动态运行库中几乎没有什么是不可访问的,所以我想按照这些思路思考并没有多大帮助,而且在某种程度上你可以忽略这个愿望。我怀疑是否有人将完全编译的应用程序用作静态库。这不应该是个问题。@Tommy我想你可能是对的。只要看看,似乎有人知道他们在做什么,无论我如何尝试私有化,他们都可以很容易地找到访问它的方法。“糟透了!”克劳菲什琼斯-有趣的文章。您可以尝试通过某种密码对其进行加密,但我认为这超出了这个答案的范围(呃)。如果我做了上述操作,它将在编译时处理?另外:我认为在运行时解密它会非常昂贵,内存和处理器方面不是吗?但它值得一玩。。。不用担心范围,我一直在玩commmon加密库:)我想我的最终目标是