2010-05-30 124 views

回答

16

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提到的那样。

+0

是什么意思(使用上面的代码为例)时,在方法声明中出现以下内容:' - (空)mutateArray:(NSMutableArray的** )阵列;'? – Garry 2010-05-31 08:41:41

+0

@Garry:新增 - 是否清除它? – 2010-05-31 09:25:15

4

除了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

0

正如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"]; 
}