如何在Objective-C类中初始化常量成员C数组?

时间:2011-09-30 14:17:44

标签: objective-c c arrays initialization constants

如何在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;
    }
}

2 个答案:

答案 0 :(得分:2)

您可以采用C方法并在.m中使用常量数组:

static const int myArray[3] = { 5, 6, 7 };

此数组的生命周期是程序的持续时间,并且每个实例不需要malloc或存储。

否则,objc类型的变量实际上没有常量值(除非你满足于不可变的归零内存)。你能做的最好的事情就是让ivar变得私密,而不是提供一个二传手。 const ivar也没有很多适用性,因为在这种情况下编译器可以进行的优化很少。当然,你可以抛弃常数,但这是一个坏主意。

最后一种选择:您可以使用使用其默认构造函数创建的c ++实例。

否则,您将不得不使用动态分配来创建动态填充的const成员变量。

答案 1 :(得分:-1)

就像惯例一样,你不应该在@implementation周围加上大括号。 关于您的问题:我看到您尝试为阵列分配方式时遇到的问题有以下错误:

初始化对象的新ObjC实例时,其实例变量设置为零,因此您的数组将为[0] == a [1] == a [2] == 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 []的大小,这样做肯定会遇到麻烦:)