如何在Objective-C类中创建常量C数组成员?生命周期应该局限于类的生命周期,我不想使用malloc。
目前我正在做这件事:
@interface Bla
{
int myArray[3];
}
@implementation Bla
{
-(id)init
{
myArray[1] = 5;
myArray[2] = 6;
myArray[3] = 7;
return self;
}
}但我希望它是常量,并直接初始化它,如下所示:
@interface Bla
{
const int myArray[3];
}
@implementation Bla
{
-(id)init
{
myArray[] = { 5, 6, 7 };
return self;
}
}发布于 2011-10-09 05:11:14
您可以采用C方法并在.m中使用常量数组:
static const int myArray[3] = { 5, 6, 7 };此数组的生命周期是程序的持续时间,它不需要每个实例的malloc或存储空间。
否则,对于objc类型的变量来说,实际上没有常量值这样的东西(除非你满足于不变的清零内存)。你能做的最好的事情就是让ivar成为私有的,而不是提供setter。const ivar也没有太多的适用性,因为在这种情况下编译器可以进行的优化很少。当然,你可以抛弃不变,但这不是一个好主意。
最后一种选择是:可以使用c++实例,该实例是使用其默认构造函数创建的。
否则,您将不得不使用动态分配来创建动态填充的常量成员变量。
发布于 2011-10-09 04:33:04
就像惯例一样,你不应该用大括号把@implementation括起来。关于您的问题:我发现您尝试分配数组的方式存在以下错误:
初始化对象的新ObjC实例时,其实例变量将设置为零,因此您的数组将是== a1 == a2 == 0。这是因为分配器将请求对象大小+其祖先大小的堆内存。但是在后面的代码中,您尝试将内存从堆栈复制到堆:在堆栈上创建{ 4,5,6}数组,而array[]驻留在堆上。你看到这里的问题了吗?如果你坚持这样做,我会这样做:
// compile from command line with
// gcc -framework Foundation -g -Wall -o test test.m
//
#import <Foundation/Foundation.h>
@interface Bla : NSObject
{
int array[3];
}
- (void)checkArray;
@end
@implementation Bla
- (id)init
{
self = [super init];
if (self) {
// init here
int tmpArray[3] = { 4, 5, 6};
memcpy(array, tmpArray, 3 * sizeof(int));
}
return self;
}
- (void)checkArray
{
NSAssert(array[0] == 4, @"invalid array initialization (4)");
NSAssert(array[1] == 5, @"invalid array initialization (5)");
NSAssert(array[2] == 6, @"invalid array initialization (6)");
}
@end
int main() {
NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init];
{
Bla *bla = [[Bla alloc] init];
[bla checkArray];
NSLog(@"done");
[bla release];
}
[pool release];
return 0;
}这不是最好的方法,也许你想坚持使用malloc,但是这样你以后就不需要释放数组了。此外,请记住,这样做您将无法更改array[]的大小,这样做肯定会遇到麻烦:)
https://stackoverflow.com/questions/7611696
复制相似问题