【问题标题】:How to create a c array?如何创建一个c数组?
【发布时间】:2012-05-07 01:46:25
【问题描述】:

如何在构造函数中设置指向 C 数组的指针?

@implementation NSBufferedInputStream {
    char *buffer;
    int bufferSize;
}

- (id)initWithFileAtPath:(NSString *)path
{
    self = [super initWithFileAtPath:path];
    if (self) {
        bufferSize = 100;
        buffer = char[bufferSize]; // ERROR: Expected expression
    }
}
@end

【问题讨论】:

  • 乍一看,我会说它是因为 c 不支持动态数组而不使用 malloc 或类似的东西。

标签: objective-c c arrays pointers


【解决方案1】:

如果你真的需要一个动态大小的数组,

- (id)initWithFileAtPath:(NSString *)path
{
    self = [super initWithFileAtPath:path];
    if (self) {
        bufferSize = 100;
        buffer = malloc(sizeof(char) * bufferSize);
    }
}

- (void)dealloc
{
    free(buffer);
    [super dealloc];
}

否则,如果您的数组大小在编译时已知,只需将您的 ivar 从 char *buffer; 更改为:

char buffer[100]

【讨论】:

  • 如果苹果现在有自动引用计数,你为什么要使用 dealloc?
  • ARC 无法为您处理释放您的malloc() 呼叫--如果您使用malloc(),则必须使用free()。所以在这里实现-dealloc 很重要——但如果你使用ARC,你应该调用[super dealloc];,因为这将被自动处理。
【解决方案2】:

如果数组的大小是动态的——使用malloc,如果不是,则需要在声明处做:

@implementation NSBufferedInputStream {
    char buffer[100];
    int bufferSize;
}

【讨论】:

  • 当您说动态时,是否可以在不复制其内容的情况下增加数组的大小?那将非常有用。在这种情况下,我有一个 setBufferSize 方法,可以在加载文件之前更改缓冲区大小。
  • 你知道 NSMutableArray 是否使用 realloc 吗?目前我的结构有一个 NSObject 包装器,所以我可以使用 NSMutableArray ,但效率很低。
猜你喜欢
  • 2012-10-22
  • 1970-01-01
  • 1970-01-01
  • 2011-04-14
  • 2010-09-17
  • 2012-05-15
  • 1970-01-01
  • 1970-01-01
  • 2022-11-23
相关资源
最近更新 更多