NSInteger 的多维数组作为实例变量
Multidimensional array of NSInteger as instance variable
我正在尝试理解 Objective C 数组。我想要做的是创建一个多维 NSInteger
实例数组。
下面的代码是否创建了一个等同于启动数组的数组和 运行 每个点都包含 NSNull
的双 for 循环?
@interface Builder: UIView {
NSInteger superDuperArray[5][4];
}
考虑到这不是 NSMutableArray
,我如何 add/replace 特定数据 (NSInteger
s)?我需要在文件的其他地方用几种不同的方法这样做。
您声明的实例变量确实创建了一个多维数组,该数组可从对象中的任何方法访问。但是,它不包含 NSNull
s,因为那是一个对象,而 NSInteger
是原始类型。它在每个槽中包含 0(所有 ivar 在对象分配时都被初始化为其适当的零值)。
如果您不需要更改数组的大小,那么您就大功告成了。您访问对象内部的数组就像访问其他任何地方的数组一样,通过下标: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
块中。
一个 NSInteger 只是一个 C 'int'(或者在 64 位平台上是 64 位长——尽管大小并不重要)。
所以你声明的只是一个 C 数组,整数。因为它们是简单的整数,所以没有 NSNull。
如果您声明了 NSArray
(2D 的 NSArray
)那么您将查看 NSNull
和 NSNumber
在元素中。
我正在尝试理解 Objective C 数组。我想要做的是创建一个多维 NSInteger
实例数组。
下面的代码是否创建了一个等同于启动数组的数组和 运行 每个点都包含 NSNull
的双 for 循环?
@interface Builder: UIView {
NSInteger superDuperArray[5][4];
}
考虑到这不是 NSMutableArray
,我如何 add/replace 特定数据 (NSInteger
s)?我需要在文件的其他地方用几种不同的方法这样做。
您声明的实例变量确实创建了一个多维数组,该数组可从对象中的任何方法访问。但是,它不包含 NSNull
s,因为那是一个对象,而 NSInteger
是原始类型。它在每个槽中包含 0(所有 ivar 在对象分配时都被初始化为其适当的零值)。
如果您不需要更改数组的大小,那么您就大功告成了。您访问对象内部的数组就像访问其他任何地方的数组一样,通过下标: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
块中。
一个 NSInteger 只是一个 C 'int'(或者在 64 位平台上是 64 位长——尽管大小并不重要)。
所以你声明的只是一个 C 数组,整数。因为它们是简单的整数,所以没有 NSNull。
如果您声明了 NSArray
(2D 的 NSArray
)那么您将查看 NSNull
和 NSNumber
在元素中。