2

我正在尝试使用此代码在 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);}

PS我是Objective C的新手,谁能解释一下我们什么时候使用

@synthesize someProperty;

对比

@synthesize someProperty = _someProperty;

谢谢你!

4

4 回答 4

2

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

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

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

并且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];
    }
}
于 2012-06-24T14:23:30.680 回答
1

取自文档:

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

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

于 2012-06-24T14:21:37.623 回答
1

很简单的问题:

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

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

于 2012-06-24T14:25:07.040 回答
1

在您的代码中,您测试条件:

if(!_variableToBePassedIntoTheDictionary)

如果条件为真,即数组为 nil,则分配初始化它。在以下声明中:

[_variableToBePassedIntoTheDictionary replaceObjectAtIndex:0 withObject:variable];
,您尝试用变量替换索引 0 处的对象。但是在上面的例子中,如果你只是分配初始化数组,它是空的,并且你不能替换索引 0 处的对象不存在,这会引发一个异常:

*** 由于未捕获的异常“NSRangeException”而终止应用程序,原因:“*** -[__NSArrayM replaceObjectAtIndex:withObject:]:空数组的索引 0 超出范围”

因此,您要做的就是将最后一行更改如下:

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 文档,它非常详尽。

于 2012-06-24T14:26:20.430 回答