replaceObjectAtIndex:withObject不起作用

时间:2012-06-24 13:51:59

标签: objective-c nsmutablearray nsmutabledictionary

我正在尝试使用此代码

在NSMutableArray中分配对象
- (IBAction)variablePressed:(UIButton *)sender {
NSString *variable = [sender currentTitle];
if (!_variableToBePassedIntoTheDictionary) _variableToBePassedIntoTheDictionary = [[NSMutableArray alloc] init];
[_variableToBePassedIntoTheDictionary replaceObjectAtIndex:0 withObject:variable];}

但是当我运行这个程序时,程序在最后一行中断,因为我设置了调试器以在出现异常时显示警告。在没有断点的情况下运行程序,程序会发出SIGARBT并崩溃。然后,我将这些值分配给字典,该字典将传递给模型以进行进一步计算。

- (IBAction)testVariableValues:(id)sender {
if (!_variablesAssignedInADictionary) _variablesAssignedInADictionary = [[NSMutableDictionary alloc] init];
[_variablesAssignedInADictionary setObject:_digitToBePassedIntoTheVariable forKey:_variableToBePassedIntoTheDictionary];
NSLog(@"%@", _variablesAssignedInADictionary);}

P.S。我是Objective C的新手,有人可以解释我们何时使用

@synthesize someProperty;

VS

@synthesize someProperty = _someProperty;

谢谢!

4 个答案:

答案 0 :(得分:2)

第一次调用该方法时,您创建NSMutableArray,然后尝试替换不存在的对象。参考文献说:

- (void)replaceObjectAtIndex:(NSUInteger)index withObject:(id)anObject
  

要替换的对象的索引。此值不得超过   数组的边界。重要如果,则引发NSRangeException   index超出了数组的末尾。

0将超出空数组的范围。

请改为尝试:

- (IBAction)variablePressed:(UIButton *)sender
{
    NSString *variable = [sender currentTitle];
    if (_variableToBePassedIntoTheDictionary == nil)
    {
        _variableToBePassedIntoTheDictionary = [[NSMutableArray alloc] init];
        [_variableToBePassedIntoTheDictionary addObject:variable];
    }
    else
    {
        [_variableToBePassedIntoTheDictionary replaceObjectAtIndex:0 withObject:variable];
    }
}

答案 1 :(得分:1)

取自文档:

  

要替换的对象的索引。该值不得超过   数组的边界。

正如我从您的代码中看到的那样,您的数组已初始化,并且索引0处没有对象。因此,当您的数组为空时,您尝试替换超出范围的索引处的对象。

答案 2 :(得分:1)

非常简单的问题:

你告诉它停止异常。很公平。什么是例外?让我猜一下,一个出界的例外?例外情况告诉你在大多数情况下出了什么问题。

replaceObjectAtIndex:0:那个索引有什么东西吗?可能不是。

答案 3 :(得分:1)

在您的代码中测试条件:

if(!_variableToBePassedIntoTheDictionary)

如果条件为真,那就是数组是nil,那么你就是alloc-init它。 在以下声明中:

[_variableToBePassedIntoTheDictionary replaceObjectAtIndex:0 withObject:variable];
, 您尝试将索引0处的对象替换为变量。但是在上面的例子中,如果你只是对数组进行alloc-init,那么它是空的,你不能将索引0处的对象替换为不存在,这会引发异常:

*** Terminating app due to uncaught exception 'NSRangeException', reason: '*** -[__NSArrayM replaceObjectAtIndex:withObject:]: index 0 beyond bounds for empty array'

所以你需要做的是改变最后一行,如下所示:

if([_variableToBePassedIntoTheDictionary count]==0) {
  [_variableToBePassedIntoTheDictionary addObject:variable]
} else {
[_variableToBePassedIntoTheDictionary replaceObjectAtIndex:0 withObject:variable]
}

至于关于属性的第二个问题,请考虑合成的作用是根据您分配给@property的属性为您创建setter / getter方法。在新的Objective-C中,您不需要声明与属性关联的ivar(ivar是表示属性的实例变量),默认情况下编译器会为ivar分配属性的名称。通过使用

@synthesize someProperty = _someProperty

约定您指定要将ivar称为_someProperty。这种方法相对于默认方法的优点是你不能直接使用setter / getter方法和ivar混淆对属性的访问,也就是说你不能犯下这样的错误:

someProperty=value

但你必须写:

_someProperty=value
or
self.someProperty=value

无论如何看看Obj-C文档,这是非常详尽的。