Objective-C:变异参数

时间:2013-11-21 19:05:57

标签: ios objective-c cocoa-touch

让方法编辑参数而不是在类别中是否安全。

例如,在ViewController子类中只有这样的方法:

-(void)editArray:(NSMutableArray*)array
{
    [array removeLastObject];
}

在视图控制器中调用[self editArray:(someArray)];,其中someArray是一个强大的原子属性。它似乎在我测试时起作用,我只是不知道这是否气馁。我知道我可以轻松地在一个类别中做到这一点,我只是想知道这样的事情是否安全。

2 个答案:

答案 0 :(得分:0)

这是安全的,只要您不修改引用,只需修改参数对象的内容即可。例如。在方法内部分配array不起作用,您需要通过引用传递它。关于样式,请考虑如何从许多Cocoa Touch框架方法返回错误:

NSError *error = nil;
[NSFileManager defaultManager] removeItemAtPath:filePath error:&error];

此处,参数对象(在本例中为&error)也在方法内部进行了修改。所以我认为你从风格的角度来看也很好:)

答案 1 :(得分:0)

如果在变异时更改数组,Cocoa将抛出异常*** Collection <__NSArrayM: 0x7f96432004c0> was mutated while being enumerated.

考虑代码:

NSMutableArray* a = [[NSMutableArray alloc] initWithArray:@[@"a", @"b", @"c"]];
for (id x in a) {
    [a removeLastObject];
}

在这种情况下,它会不安全并导致您的应用程序崩溃。将removeLastObject消息抽象为另一个消息并没有真正改变任何内容。

如果在后台线程上完成也不安全。