如何在 Objective C 中声明、设置属性、合成和实现一个大小为 5 的 int 数组?我正在为 iphone 应用程序编写此代码。谢谢。
5 回答
我认为“Cocoa-y”要做的事情是隐藏 int 数组,即使您在内部使用它也是如此。就像是:
@interface Lottery : NSObject {
int numbers[5];
}
- (int)numberAtIndex:(int)index;
- (void)setNumber:(int)number atIndex:(int)index;
@end
@implementation Lottery
- (int)numberAtIndex:(int)index {
if (index > 4)
[[NSException exceptionWithName:NSRangeException reason:[NSString stringWithFormat:@"Index %d is out of range", index] userInfo:nil] raise];
return numbers[index];
}
- (void)setNumber:(int)number atIndex:(int)index {
if (index > 4)
[[NSException exceptionWithName:NSRangeException reason:[NSString stringWithFormat:@"Index %d is out of range", index] userInfo:nil] raise];
numbers[index] = number;
}
这里有一些东西可以尝试。在 .h 文件中:
@property int* myIntArray;
然后,在 .m 文件中:
@synthesize myIntArray;
如果您使用@synthesize,您可能需要自己 malloc/calloc 数组,可能在 init() 期间。
或者,您可以编写自己的访问器函数,如果在分配数组之前调用它们,则使用 malloc/calloc。
无论哪种方式,您都需要在 dealloc() 方法中释放数组。
这可能是天真和错误的,因为我自己只是在学习 Objective C,但到目前为止它似乎对我有用。
如果要使用数组,则不应在这种情况下使用 int 。使用 NSNumber 并将这 5 个 NSNumber 放入 NSMutableArray。
@interface testClass: NSObject {
NSMutableArray* numbers;
}
@property (nonatomic, retain) NSMutableArray* numbers;
-(id)initWithValue:(NSNumber *)initialValue;
@end
@implementation testClass
@synthesize numbers;
-(id)initWithValue:(NSNumber *)initialValue {
numbers = [[NSMutableArray alloc] initWithCapacity:5];
[numbers addObject:initialValue];
return self;
}
@end
是带有合成的接口和实现的代码(未测试 BTW)。你想达到什么目的?
我有一个类变量:
NSInteger myInt[5];
为了在代码中使用正常的 myInt[1]=0 语法,我创建了一个返回整数指针的属性:
@property (nonatomic, readonly) NSInteger *myInt;
然后创建了以下getter方法:
-(NSInteger *) myInt {
return myInt
}
现在我可以使用类似 class.myInt[1]=0;
好吧,我不确定这是否有效,但似乎可以。我只是想如果其他人想尝试的话,我会把它放在那里。
无论你做什么,你都必须意识到后果。
整数数组不进行引用计数。你不知道有多少人在访问它。你不知道谁应该在什么时候释放它。所以你可以很容易地拥有一个 int* 类型的属性。setter 将获取一个指针并将其存储到实例变量中。getter 将返回实例变量的内容。它只是工作。
但是您不知道何时应该分配或释放数组。如果您有一些静态数组(例如四个包含数字的不同表),没问题。但是如果你用 malloc() 创建一个整数数组,就应该有人 free() 它。那么这会发生在什么时候呢?
Because having to handle the lifetime of an array manually is rubbish, I'd recommend that you either just use an NSArray of NSNumber, or you look at NSPointerArray which can be abused to store arrays of integers with reference counting, or you create your own class like the Lottery class in a previous answer, just a bit more flexible.