Iphone 当维度在类实例化时未定义时,如何在Objective-C中将浮点数组声明为类变量?

Iphone 当维度在类实例化时未定义时,如何在Objective-C中将浮点数组声明为类变量?,iphone,objective-c,Iphone,Objective C,在Java中,它将如下所示: class Foo { float[] array; } Foo instance = new Foo(); instance.array = new float[10]; 您可以只使用指针: float *array; // Allocate 10 floats -- always remember to multiple by the object size // when calling malloc array = (float *)malloc(1

在Java中,它将如下所示:

class Foo
{
  float[] array;
}

Foo instance = new Foo();
instance.array = new float[10];

您可以只使用指针:

float *array;
// Allocate 10 floats -- always remember to multiple by the object size
// when calling malloc
array = (float *)malloc(10 * sizeof(float));
...
// Deallocate array -- don't forget to do this when you're done with your object
free(array);
如果您使用的是Objective-C++,则可以执行以下操作:

float *array;
array = new float[10];
...
delete [] array;

这里有另一种方法。创建NSMutableArray对象并向其添加NSNumber对象。这由你来决定是否明智

NSMutableArray *array;
array = [[NSMutableArray alloc] init];
[array addObject:[NSNumber numberWithFloat:1.0f]];
[array release];

在Objective-C中执行此操作的另一种方法是使用索引实例变量:

@interface ArrayOfFloats : NSObject {
@private
  NSUInteger count;
  float      numbers[0];
}
+ (id)arrayOfFloats:(float *)numbers count:(NSUInteger)count;
- (float)floatAtIndex:(NSUInteger)index;
- (void)setFloat:(float)value atIndex:(NSUInteger)index;
@end

@implementation ArrayOfFloats
+ (id)arrayOfFloats:(float *)numbers count:(NSUInteger)count {
    ArrayOfFloats *result = [NSAllocateObject([self class], count * sizeof(float), NULL) init];
    if (result) {
        result->count = count;
        memcpy(result->numbers, numbers, count * sizeof(float));
    }
    return result;
}
...
@end

有关更多信息,请参阅的文档。索引实例变量的一个限制是,您不能对使用它们的类进行子类化。

我想如果不使用基本float类型,将导致性能损失。另外,当所需维度事先已知(并且不会改变)时,使用可变数组似乎有些过分。是的,您必须进行测量才能确定,但这肯定会更慢&使用更多内存。但在某些情况下,使用NSArray/NSMutableArray可能很方便。例如,您可以轻松地使用plist文件进行读写操作。您可以初始化具有特定大小的可变数组,即使事先知道该大小,但如果您不想将所有项添加到一个数组中,您可能仍然需要可变数组。有一个性能问题,但一般来说,它比错误使用malloc的危险要好得多。这不是一个类变量,而是一个实例变量-类的每个实例都有一个。注意:对于ARC,您不能使用NSAllocateObject(),您需要坚持使用
+(id)alloc