无法替换NSMutableArray中的对象

时间:2013-08-01 13:25:44

标签: objective-c

不知何故,下面的代码抛出了一个 NSInvalidArgumentException ,虽然我一步一步地确保一切都有正确的值......

我有一个存储在NSValues中的CGPoints数组,这是通过(x,y)偏移所有点的方法的一部分。

for (int i = 0; i < [allPoints count]; i++) {
    CGPoint pt = [[allPoints objectAtIndex:i] CGPointValue];
    CGPoint newPt = CGPointMake(pt.x + x, pt.y + y);
    NSValue *newEntry = [NSValue valueWithCGPoint:newPt];
    [allPoints replaceObjectAtIndex:i withObject:newEntry];
}

3 个答案:

答案 0 :(得分:0)

试试这个,

-----------------------------示例代码---------------- -----------------

CGPoint pt =CGPointMake(20, 30);
NSValue *point = [NSValue valueWithCGPoint:pt];

CGPoint pt2 =CGPointMake(40, 40);
NSValue *point2 = [NSValue valueWithCGPoint:pt2];

NSMutableArray *allPoints =[[NSMutableArray alloc]initWithObjects:point,point2, nil];
NSLog(@"%@",allPoints);
// -------------output----------
//     "NSPoint: {20, 30}",
//     "NSPoint: {40, 40}"
int x=10; int y=20;
for (int i = 0; i < [allPoints count]; i++)
{
    CGPoint pt = [[allPoints objectAtIndex:i] CGPointValue];
    CGPoint newPt = CGPointMake(pt.x + x, pt.y + y);
    NSValue *newEntry = [NSValue valueWithCGPoint:newPt];
    [allPoints replaceObjectAtIndex:i withObject:newEntry];
}
NSLog(@"%@",allPoints);
// -------------output----------
//     "NSPoint: {30, 50}",
//     "NSPoint: {50, 60}"

答案 1 :(得分:0)

NSMutableArray方法replaceObjectAtIndex:如果给定索引处的对象为nil或新对象为nil,则withObject会引发NSInvalidArgumentException。 仔细检查allPoints NSMutableArray中的一个对象是否为零。

或allPoints NSMutableArray不包含带有CGPoint元素的NSValue对象。

答案 2 :(得分:0)

我不知道如何,但看起来虽然我声明allPoints是 NSMutableArray ,但在我的整个代码中搜索之后,我无法在任何将allPoints指针设置为<的地方找到strong> NSArray ,但系统似乎现在认为allPoints现在是 NSArray ,因此我无法替换任何对象。

因此,我必须绕过一个新的NSMutableArray。

for (int i = 0; i < [allPoints count]; i++) {
    CGPoint pt = [[allPoints objectAtIndex:i] CGPointValue];
    CGPoint newPt = CGPointMake(pt.x + x, pt.y + y);
    NSValue *newEntry = [NSValue valueWithCGPoint:newPt];
    NSMutableArray *temp = [NSMutableArray arrayWithArray:allPoints];
    [temp replaceObjectAtIndex:i withObject:newEntry];
    allPoints = temp;
}