我想为我的班级提供一个内部 int 数组,但我似乎无法让 XCode 让我这样做。数组大小需要在初始化时设置,所以我不能将大小直接放入接口中。
目前我一直在尝试:
@interface TestClass : NSObject {
int test[];
}
但它告诉我,我不被允许。如何在我的界面中引用它,然后在创建实现时如何分配它?
对于一个听起来有点标准的问题,我很抱歉,但我似乎无法通过搜索找到我需要的答案。
编辑:我想使用数组,因为它显然比使用 NSArray 快得多
我想为我的班级提供一个内部 int 数组,但我似乎无法让 XCode 让我这样做。数组大小需要在初始化时设置,所以我不能将大小直接放入接口中。
目前我一直在尝试:
@interface TestClass : NSObject {
int test[];
}
但它告诉我,我不被允许。如何在我的界面中引用它,然后在创建实现时如何分配它?
对于一个听起来有点标准的问题,我很抱歉,但我似乎无法通过搜索找到我需要的答案。
编辑:我想使用数组,因为它显然比使用 NSArray 快得多
您可以使用多种方法来解决此问题,但最简单的方法是简单地将实例变量设为指针,如下所示:
@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
in 这样的对象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];
在设置对象时保留对象(如前面的示例),请始终确保在 classesdealloc
方法中释放对象。
AC 阵列只是一个足够大的原始内存缓冲区。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 中声明。
尝试这样的事情:
@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