我试图理解Objective C数组。我想做的是创建一个多维的NSInteger
实例数组。
下面的代码是否创建了一个数组,等同于初始化一个数组并在每个点运行一个包含NSNull
的双for循环?
@interface Builder: UIView {
NSInteger superDuperArray[5][4];
}
考虑到这不是NSMutableArray
,我如何添加/替换特定数据(NSInteger
s) ?我需要在文件的其他地方,在几个不同的方法中这样做。
您声明的实例变量确实创建了一个多维数组,该数组可从对象中的任何方法访问。但是,它不包含NSNull
s,因为这是一个对象,而NSInteger
是一个基本类型。它在每个槽中包含0(所有变量在对象分配时初始化为相应的0值)。
如果你不需要改变数组的大小,你就差不多完成了。你访问对象内部的数组就像访问其他地方的数组一样,通过下标: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;
}
注意:最后一行。原始数组没有固有的边界检查。在您设置的范围之外的访问可能不会崩溃或导致任何立即明显的问题。相反,您将在读取时获得垃圾,并在写入时损坏内存。你应该在你的访问方法中包含边界检查。
另外,一个样式说明:在对象的接口中放置变量不再是好的ObjC形式。将其隐藏在@implementation
块中
NSInteger是一个简单的C 'int'(或者64位平台上的64位long -尽管大小无关紧要)。
所以你声明的只是一个C数组,一个整数数组。因为它们是简单整数,所以没有NSNull。
如果您声明了NSArray
(2D的NSArray
) ,那么您将在元素中查看NSNull
和NSNumber
。