在Objective-C中创建一个整数数组

时间:2013-08-12 09:19:56

标签: iphone objective-c xcode nsarray

我希望我的班级有一个内部的int数组,但我似乎无法让XCode让我。数组大小需要在初始化时设置,因此我无法将大小直接放入接口。

目前我一直在尝试:

@interface TestClass : NSObject {
  int test[];
}

但它告诉我,我不被允许。如何在界面中引用它,然后在创建实现时如何分配它?

对于一个有点标准的听起来问题感到抱歉,但我似乎找不到搜索所需的答案。

编辑:我想使用数组,因为它显然比使用NSArray快得多

3 个答案:

答案 0 :(得分:2)

您可以使用多种方法来解决此问题,但最简单的方法是简单地将实例变量设为指针,如下所示:

@interface TestClass : NSObject {
    int *test;
}

@property int *test;

@end

合成属性将为getter和setter方法提供可用于设置其内容的方法:

@implementation TestClass
@synthesize test;

//contents of class

@end

然后您可以像这样使用它:

TestClass *pointerTest = [[TestClass alloc] init];

int *array = (int *)malloc(sizeof(int) * count);
//set values

[pointerTest setTest:array];
[pointerTest doSomething];

但是,在NSNumber中使用NSArray这样的对象是更好的方法,也许您可​​以这样做:

@interface TestClass : NSObject {
    NSArray *objectArray;
}

@property (nonatomic, strong) NSArray *objectArray;

@end

@implementation TestClass
@synthesize objectArray;

//contents of class

@end

然后,您可以使用指向NSArray对象的指针设置其内容:

NSArray *items = [NSArray arrayWithObjects:[NSNumber numberWithInt:1], [NSNumber numberWithInt:2], nil];

TestClass *arrayClass = [[TestClass alloc] init];
[arrayClass setItems:items];

[arrayClass doSomething];

在设置对象时保留对象(如上例所示),请务必确保在类dealloc方法中取消分配对象。

答案 1 :(得分:0)

C数组只是一个足够大小的原始内存缓冲区。 Foundation有一个很好的原始内存包装器,可以让你从所有的手动内存管理中解脱出来:NSMutableData

以下方法为您提供自动内存管理以及适当的封装。

@interface TestClass : NSObject

@property (nonatomic, readonly) int *testArray;
@property (nonatomic, readonly) NSUInteger testArraySize;

@end


@implementation TestClass
{
    NSMutableData *_testData;
}

- (id)initWithSize:(NSUInteger)size
{
    self = [self init];
    if (self != nil) {
        _testData = [NSMutableData dataWithLength:size];
    }
}

- (int *)testArray
{
    return [_testData mutableBytes];
}

- (NSUInteger)testArraySize
{
    return [_testData length];
}

@end

如您所见,ivar不必在@interface中声明。

答案 2 :(得分:-1)

尝试这样的事情:

@interface TestClass : NSObject
{
    int *_test; 
}

@property (assign) int *test;

@end

@implementation TestClass

- (instancetype)init
{
    if (self = [super init])
    {
        _test = malloc(sizeof(int) * 20);
    }
    return self;
}

- (int *)test
{
    return _test;
}

- (void)setTest:(int*)test
{
    memcpy(&_test, &test, sizeof(_test));
}

- (void)dealloc
{
    free(_test);
}

@end