【问题标题】:NSMutableArray initWithCapacity failingNSMutableArray initWithCapacity 失败
【发布时间】:2012-04-26 00:10:11
【问题描述】:

我正在尝试初始化 NSMutableArray,但它无法正常工作。对数组的后续访问会引发异常,提示“空数组的索引 0 超出范围”。初始化行后面的断点表示我的数组在内存中有一个位置,但它有 0 个对象

这是我目前的尝试:

在我的 .h 中

@interface SomeInterface : NSObject 
{
@private
    NSMutableArray *myArr;
}

在我的 .m 中

- (id) initWithHeight: (int) height
{
    self = [super init];
    if (self) 
    {
        self->myArr = [[NSMutableArray alloc] initWithCapacity:height];
    }
    return self;
}

断点显示 myArr = (NSMutableArray *) 0x######## 0 个对象

有人知道如何正确初始化 NSMutableArray 吗?

【问题讨论】:

    标签: objective-c nsmutablearray init


    【解决方案1】:

    initWithCapacity: 不会在您的数组中创建对象,因此调试器不会说谎 - 您的数组是空的,直到您向其中添加对象,或者使用 addObject: 或首先使用对象对其进行初始化。

    【讨论】:

    • 我刚刚在类参考中发现了这一点:注意 NSArray 对象不像 C 数组。也就是说,即使您在创建数组时指定了大小,指定的大小也被视为“提示”;数组的实际大小仍然为 0。这意味着您不能在大于数组当前计数的索引处插入对象。例如,如果一个数组包含两个对象,其大小为 2,因此您可以在索引 0、1 或 2 处添加对象。索引 3 是非法的且超出范围;如果您尝试在索引 3 处添加对象(当数组的大小为 2 时),NSMutableArray 会引发异常。
    • 已解决:我正在绘制索引错误,因为我尝试使用 replaceObjectAtIndex:withObject。考虑到数组仍然是空的,这不起作用。 insertObject:atIndex 允许访问下一个打开的索引,如上面的类引用中所指定。
    • 是的。 insertObject:atIndex: 也可以。但是你可能应该只使用addObject:,除非你没有按顺序添加它们。
    【解决方案2】:

    正如 yonix 指出的那样,您没有创建任何对象,这里有一个添加对象的示例:

    .h

    #import <Foundation/Foundation.h>
    
    @interface Ssuti : NSObject 
    {
        NSMutableArray *_myArr;
    }
    
    @property (nonatomic, assign) NSMutableArray *myArr;
    
    - (id) initWithHeight: (int) height;
    
    @end
    

    .m

    #import "Ssuti.h"
    
    
    @implementation Ssuti
    
    @synthesize myArr = _myArr;
    
    
    - (void)dealloc {
         [super dealloc];
    }
    
    - (id) initWithHeight: (int) height
    {
        self = [super init];
        if (self) 
        {
            self.myArr = [NSMutableArray array];
    
            [self.myArr addObject:[NSNumber numberWithInt:height]];
    
            NSLog(@"myArr :: %@", self.myArr);
        }
        return self;
    }
    
    @end
    

    然后在 ViewController 中调用它:

    Ssuti *mySssuti = [[Ssuti alloc]initWithHeight:345];
    
        [mySssuti release];
    

    ;)

    【讨论】:

      猜你喜欢
      • 2011-03-08
      • 2011-04-26
      • 1970-01-01
      • 2011-10-13
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多