我试图理解Objective C数组。我想要做的是创建一个多维NSInteger
实例数组。
下面的代码是否创建了一个等效于启动数组并在每个点运行包含NSNull
的double for循环的数组?
@interface Builder: UIView {
NSInteger superDuperArray[5][4];
}
如果这不是NSInteger
,我如何添加/替换特定数据(NSMutableArray
)?我需要在文件的其他地方使用几种不同的方法。
答案 0 :(得分:0)
您声明的实例变量确实创建了一个可以从对象中的任何方法访问的多维数组。但是,它不包含NSNull
,因为它是一个对象,而NSInteger
是一个基本类型。它在每个槽中包含0(所有ivars在对象的分配时被初始化为它们适当的零值)。
如果您不需要更改阵列的大小,那么您已经完成了很多工作。您可以访问对象内部的数组,就像您在其他任何地方访问数组一样,通过下标:superDuperArray[2][1]
,例如。
以下是完整的示例:
#import <Foundation/Foundation.h>
@interface Mutli : NSObject
- (NSInteger)numberAtRow:(NSInteger)row column:(NSInteger)col;
- (void)setNumber:(NSInteger)newNum atRow:(NSInteger)row column:(NSInteger)col;
@end
@implementation Mutli
{
NSInteger numbers[5][4];
}
-(void)setNumber:(NSInteger)newNum atRow:(NSInteger)row column:(NSInteger)col
{
numbers[row][col] = newNum;
}
- (NSInteger)numberAtRow:(NSInteger)row column:(NSInteger)col
{
return numbers[row][col];
}
@end
int main(int argc, const char * argv[])
{
@autoreleasepool {
Mutli * m = [Mutli new];
[m setNumber:10 atRow:2 column:1];
NSLog(@"%ld", [m numberAtRow:2 column:1]);
// This may not crash!
[m setNumber:10 atRow:100 column:34];
}
return 0;
}
N.B。最后一行。原始数组没有固有的边界检查。在您设置的范围之外的访问可能不会崩溃或导致任何立即引起注意的问题。相反,你会为读取获取垃圾,并在写入时损坏内存。 (从技术上讲,你是invoking Undefined Behavior。)你应该在你的访问者方法中真正包含边界检查。
另外,一个样式注释:将ivars放在对象的界面中不再是好的ObjC形式。正如我所做的那样,将其隐藏在@implementation
块中。
答案 1 :(得分:0)
NSInteger只是一个C'int'(或64位平台上的64位长 - 虽然大小并不重要)。
所以你声明的只是一个整数的C数组。因为它们是简单的整数,所以没有NSNull。
如果您宣布NSArray
(对于2D为NSArray
),那么您将在NSNull
和NSNumber
中查看元素。