我正在尝试使用此代码
在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;
谢谢!
答案 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文档,这是非常详尽的。