如何在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;
}
}
答案 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 []的大小,这样做肯定会遇到麻烦:)