通过参考传递数组Objective-C
答
Objective-C的对象始终按引用传递(使用指针) - 你不能按值传递它们。
I.e.以下是好的:
- (void)mutateArray:(NSMutableArray*)array {
// alter array ...
}
......并且可以是例如调用这样的:
NSMutableArray *array = ...;
[self mutateArray:array];
还有通过引用传递指针的可能性:被用作out参数
- (void)newArray:(NSMutableArray **)array;
在这种情况下array
- 你传递一个参考的指针收到一个实例:
- (void)newArray:(NSMutableArray **)array {
*array = [[NSMutableArray alloc] init];
}
...可称为像这样:
NSMutableArray *array = nil;
[self newArray:&array];
仅当返回值已被使用并且必须返回其他信息时,才会使用out参数。举例来说,错误信息就像dreamlax提到的那样。
答
除了Georg Fritzche的回答,可能值得注意的是,有些方法期望得到对象指针的地址。例如:
NSError *anError; // points to garbage now
NSStringEncoding enc;
NSString *aString = [NSString stringWithContentsOfFile:@"/some/file.txt"
usedEncoding:&enc
error:&anError];
if (aString == nil)
{
// anError now points to an initialised NSError object.
}
它变得棘手,因为一些记录方法要求你释放以这种方式获得的对象,有的没有(为一个确实需要明确的释放,见NSPropertyListSerialization
的例子)。
+0
任何需要你以这种方式释放返回的指针的方法*应该*具有明确的文档,因为它违反了Cocoa引用计数的内存管理的基本规则。 – JeremyP 2010-05-31 15:24:02
答
正如Georg Fritzsche所说,NSMutableArray通过自动引用,而不是NSArray。最好的选择是太看波纹管代码:
void mutateImmutableArray(NSArray *array);
void mutateMutableArray(NSMutableArray *array);
void mutateImmutableArrayByRef(NSArray **array);
void mutateMutableArrayByRef(NSMutableArray **array);
int main(int argc, const char * argv[]) {
@autoreleasepool {
//Change immutable array in method that expects immutable array
NSArray *immutable = @[@1,@2,@3];
mutateImmutableArray(immutable);
NSLog(@"After 1: %@",immutable); // 1,2,3
//Change mutable array in method that expects immutable array
NSMutableArray *mutable = [@[@1,@2,@3]mutableCopy];
mutateImmutableArray(mutable);
NSLog(@"After 2: %@",mutable); //1,2,3
//Change mutable array in method that expects mutable array
mutable = [@[@1,@2,@3]mutableCopy];
mutateMutableArray(mutable);
NSLog(@"After 3: %@",mutable); //1,2,3, Four
//Change immutable array in method that expects immutable array by reference
immutable = @[@1,@2,@3];
mutateImmutableArrayByRef(&immutable);
NSLog(@"After 4: %@",immutable); //4,5,6
//Change mutable array in method that expects mutable array by reference
mutable = [@[@1,@2,@3]mutableCopy];
mutateMutableArrayByRef(&mutable);
NSLog(@"After 5: %@",mutable); //1,2,3, Four
}
return 0;
}
void mutateImmutableArray(NSArray *array)
{
array = @[@4,@5,@6];
}
void mutateImmutableArrayByRef(NSArray **array)
{
*array = @[@4,@5,@6];
}
void mutateMutableArray(NSMutableArray *array)
{
[array addObject:@"Four"];
}
void mutateMutableArrayByRef(NSMutableArray **array)
{
[*array addObject:@"Four"];
}
是什么意思(使用上面的代码为例)时,在方法声明中出现以下内容:' - (空)mutateArray:(NSMutableArray的** )阵列;'? – Garry 2010-05-31 08:41:41
@Garry:新增 - 是否清除它? – 2010-05-31 09:25:15