【问题标题】:Multidimensional array of NSInteger as instance variableNSInteger 的多维数组作为实例变量
【发布时间】:2015-07-16 00:49:52
【问题描述】:

我正在尝试理解 Objective C 数组。我要做的是创建一个多维NSInteger 实例数组。

下面的代码是否创建了一个等效于启动一个数组并在每个点运行包含NSNull 的双循环的数组?

@interface Builder: UIView {
   NSInteger superDuperArray[5][4];
}

考虑到这不是 NSMutableArray,我如何添加/替换特定数据 (NSIntegers)?我需要在文件的其他地方以几种不同的方法这样做。

【问题讨论】:

  • 声明一个数组。在创建包含对象之前,它不会创建

标签: objective-c arrays multidimensional-array instance nsinteger


【解决方案1】:

您声明的实例变量确实创建了一个多维数组,可以从对象中的任何方法访问。但是,它不包含NSNulls,因为这是一个对象,而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;
}

注意最后一行。原始数组没有固有的边界检查。超出您设置的范围的访问可能不会崩溃或导致任何立即明显的问题。相反,您会在读取时获得垃圾,并且在写入时会损坏内存。 (从技术上讲,您是 invoking Undefined Behavior。)您确实应该在访问器方法中包含边界检查

另外,风格说明:将 ivars 放在对象的接口中不再是好的 ObjC 形式。正如我所做的那样,将其隐藏在 @implementation 块中。

【讨论】:

  • 太棒了,这绝对回答了我的问题。但是,在 iOS 中,通过“Mutli * m = [Mutli new];”这一行,有没有办法让整个类都可以使用这个实例? (无需亲自将其传递给方法)
  • m 遵循与其他任何内容相同的范围规则。如果它是 ivar,则该类可以访问它。如果它是在方法或函数中声明的,则它仅在该块中可见。
【解决方案2】:

NSInteger 只是一个 C 'int'(或 64 位平台上的 64 位长 - 但大小无关紧要)。

所以你声明的只是一个 C 整数数组。因为它们是简单的整数,所以没有 NSNull。

如果您声明了 NSArray(在 2D 中为 NSArray那么您将在元素中查看 NSNullNSNumber

【讨论】:

    猜你喜欢
    • 2012-10-28
    • 1970-01-01
    • 2020-03-22
    • 1970-01-01
    • 2012-05-06
    • 2019-07-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多