首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何在Objective-C类中初始化常量成员C数组?

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

Stack Overflow用户
提问于 2011-09-30 22:17:44
回答 2查看 4K关注 0票数 3

如何在Objective-C类中创建常量C数组成员?生命周期应该局限于类的生命周期,我不想使用malloc。

目前我正在做这件事:

代码语言:javascript
复制
@interface Bla
{
    int myArray[3];
}

@implementation Bla
{
    -(id)init
    {
        myArray[1] = 5;
        myArray[2] = 6;
        myArray[3] = 7;
        return self;
    }
}

但我希望它是常量,并直接初始化它,如下所示:

代码语言:javascript
复制
@interface Bla
{
    const int myArray[3];
}

@implementation Bla
{
    -(id)init
    {
        myArray[] = { 5, 6, 7 };
        return self;
    }
}
EN

回答 2

Stack Overflow用户

发布于 2011-10-09 05:11:14

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

代码语言:javascript
复制
static const int myArray[3] = { 5, 6, 7 };

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

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

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

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

票数 2
EN

Stack Overflow用户

发布于 2011-10-09 04:33:04

就像惯例一样,你不应该用大括号把@implementation括起来。关于您的问题:我发现您尝试分配数组的方式存在以下错误:

初始化对象的新ObjC实例时,其实例变量将设置为零,因此您的数组将是== a1 == a2 == 0。这是因为分配器将请求对象大小+其祖先大小的堆内存。但是在后面的代码中,您尝试将内存从堆栈复制到堆:在堆栈上创建{ 4,5,6}数组,而array[]驻留在堆上。你看到这里的问题了吗?如果你坚持这样做,我会这样做:

代码语言:javascript
复制
// 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[]的大小,这样做肯定会遇到麻烦:)

票数 -1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/7611696

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档